From cd056aa5106d6a913f7820f5136b110e1c1c7bff Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Mon, 23 Oct 2017 19:04:53 +1100 Subject: [PATCH 001/228] Redesign and port to v11 Redesign and port to v11 Nice to see the changes to the website module, because I'm super busy with 100 different non Odoo projects I will only maintain a select few modules since I am very time poor. --- migration_wordpress/__init__.py | 4 + migration_wordpress/__manifest__.py | 23 +++ migration_wordpress/controllers/__init__.py | 3 + migration_wordpress/controllers/main.py | 46 +++++ migration_wordpress/data/res.groups.csv | 2 + migration_wordpress/doc/changelog.rst | 3 + migration_wordpress/doc/index.rst | 18 ++ migration_wordpress/models/__init__.py | 4 + .../models/migration_import_wordpress.py | 194 ++++++++++++++++++ migration_wordpress/models/website_page.py | 9 + .../security/ir.model.access.csv | 2 + migration_wordpress/static/description/1.jpg | Bin 0 -> 99863 bytes .../static/description/index.html | 17 ++ migration_wordpress/views/menus.xml | 10 + .../migration_import_wordpress_views.xml | 48 +++++ 15 files changed, 383 insertions(+) create mode 100644 migration_wordpress/__init__.py create mode 100644 migration_wordpress/__manifest__.py create mode 100644 migration_wordpress/controllers/__init__.py create mode 100644 migration_wordpress/controllers/main.py create mode 100644 migration_wordpress/data/res.groups.csv create mode 100644 migration_wordpress/doc/changelog.rst create mode 100644 migration_wordpress/doc/index.rst create mode 100644 migration_wordpress/models/__init__.py create mode 100644 migration_wordpress/models/migration_import_wordpress.py create mode 100644 migration_wordpress/models/website_page.py create mode 100644 migration_wordpress/security/ir.model.access.csv create mode 100644 migration_wordpress/static/description/1.jpg create mode 100644 migration_wordpress/static/description/index.html create mode 100644 migration_wordpress/views/menus.xml create mode 100644 migration_wordpress/views/migration_import_wordpress_views.xml diff --git a/migration_wordpress/__init__.py b/migration_wordpress/__init__.py new file mode 100644 index 000000000..511a0ca3a --- /dev/null +++ b/migration_wordpress/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import controllers +from . import models \ No newline at end of file diff --git a/migration_wordpress/__manifest__.py b/migration_wordpress/__manifest__.py new file mode 100644 index 000000000..ad02c674e --- /dev/null +++ b/migration_wordpress/__manifest__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Wordpress Migration", + 'version': "1.0", + 'author': "Sythil Tech", + 'category': "Tools", + 'support': "steven@sythiltech.com.au", + 'summary': "Copy data (pages, media) from wordpress CMS into Odoo", + 'description': "Copy data (pages, media) from wordpress CMS into Odoo", + 'license':'LGPL-3', + 'data': [ + 'data/res.groups.csv', + 'security/ir.model.access.csv', + 'views/migration_import_wordpress_views.xml', + 'views/menus.xml', + ], + 'demo': [], + 'depends': ['website'], + 'images':[ + 'static/description/1.jpg', + ], + 'installable': True, +} \ No newline at end of file diff --git a/migration_wordpress/controllers/__init__.py b/migration_wordpress/controllers/__init__.py new file mode 100644 index 000000000..6920e2020 --- /dev/null +++ b/migration_wordpress/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import main \ No newline at end of file diff --git a/migration_wordpress/controllers/main.py b/migration_wordpress/controllers/main.py new file mode 100644 index 000000000..1575112a4 --- /dev/null +++ b/migration_wordpress/controllers/main.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- + +import base64 +import werkzeug + +import odoo.http as http +import odoo +from odoo.http import request + +def binary_content(xmlid=None, model='ir.attachment', id=None, field='datas', unique=False, filename=None, filename_field='datas_fname', download=False, mimetype=None, default_mimetype='application/octet-stream', env=None): + return request.registry['ir.http'].binary_content( + xmlid=xmlid, model=model, id=id, field=field, unique=unique, filename=filename, filename_field=filename_field, + download=download, mimetype=mimetype, default_mimetype=default_mimetype, env=env) + +class ImageResizeHackController(http.Controller): + + def force_contenttype(self, headers, contenttype='image/png'): + dictheaders = dict(headers) + dictheaders['Content-Type'] = contenttype + return dictheaders.items() + + @http.route('/web/image2//x/', type="http", auth="public") + def content_image(self, xmlid=None, model='ir.attachment', id=None, field='datas', filename_field='datas_fname', unique=None, filename=None, mimetype=None, download=None, width=0, height=0): + status, headers, content = binary_content(xmlid=xmlid, model=model, id=id, field=field, unique=unique, filename=filename, filename_field=filename_field, download=download, mimetype=mimetype, default_mimetype='image/png') + if status == 304: + return werkzeug.wrappers.Response(status=304, headers=headers) + elif status == 301: + return werkzeug.utils.redirect(content, code=301) + elif status != 200 and download: + return request.not_found() + + if content and (width or height): + content = odoo.tools.image_resize_image(base64_source=content, size=(width or None, height or None), encoding='base64', filetype='PNG') + # resize force png as filetype + headers = self.force_contenttype(headers, contenttype='image/png') + + if content: + image_base64 = base64.b64decode(content) + else: + image_base64 = self.placeholder(image='placeholder.png') # could return (contenttype, content) in master + headers = self.force_contenttype(headers, contenttype='image/png') + + headers.append(('Content-Length', len(image_base64))) + response = request.make_response(image_base64, headers) + response.status_code = status + return response \ No newline at end of file diff --git a/migration_wordpress/data/res.groups.csv b/migration_wordpress/data/res.groups.csv new file mode 100644 index 000000000..fd256b46a --- /dev/null +++ b/migration_wordpress/data/res.groups.csv @@ -0,0 +1,2 @@ +"id","name","comment" +"wordpress_migration_group","Wordpress Migration Manager","Can Import Wordpress websites into the Odoo CMS" \ No newline at end of file diff --git a/migration_wordpress/doc/changelog.rst b/migration_wordpress/doc/changelog.rst new file mode 100644 index 000000000..aae8652f1 --- /dev/null +++ b/migration_wordpress/doc/changelog.rst @@ -0,0 +1,3 @@ +v1.0 +==== +* Port to v11 \ No newline at end of file diff --git a/migration_wordpress/doc/index.rst b/migration_wordpress/doc/index.rst new file mode 100644 index 000000000..59e349c62 --- /dev/null +++ b/migration_wordpress/doc/index.rst @@ -0,0 +1,18 @@ +Configuration +1. Go Settings->Users & Companies->Users +2. Select a user you want to give permission to import Wordpress websites +3. Tick the "Wordpress Migration Manager" tickbox +4. Save the record and the new "Migration" top level menu should appear + +Import Entire Media Library +1. Go to Migration top level menu +2. Create a new record and enter the URL of your Wordpress website (no credentials needed) +3. Hit "Import Media", this will download all images into the Odoo media library +*NOTE* Only the orginal image size is transferred + +Import Website pages +1. Go to Migration top level menu +2. Create a new record and enter the URL of your Wordpress website (no credentials needed) +3. Hit "Import Pages", this will copy the raw content of the page, transforming any image / link URLs in the process. +*NOTE* Due to theme styles and javascript not being transferred over, most pages will NOT retain thier original appearance. +In most cases a redesign will be neccassary however this module still saves time having to manually transfer resources. \ No newline at end of file diff --git a/migration_wordpress/models/__init__.py b/migration_wordpress/models/__init__.py new file mode 100644 index 000000000..43dd600c8 --- /dev/null +++ b/migration_wordpress/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import migration_import_wordpress +from . import website_page \ No newline at end of file diff --git a/migration_wordpress/models/migration_import_wordpress.py b/migration_wordpress/models/migration_import_wordpress.py new file mode 100644 index 000000000..32d155ef2 --- /dev/null +++ b/migration_wordpress/models/migration_import_wordpress.py @@ -0,0 +1,194 @@ +# -*- coding: utf-8 -*- + +import requests +import logging +_logger = logging.getLogger(__name__) +import json +import base64 +from lxml import html, etree + +from odoo import api, fields, models +from odoo.exceptions import ValidationError, UserError +from odoo.http import request + +class MigrationImportWordpress(models.Model): + + _name = "migration.import.wordpress" + _rec_name = "wordpress_url" + + wordpress_url = fields.Char(string="Wordpress URL") + wordpress_page_ids = fields.One2many('website.page', 'wordpress_id', string="Wordpress Pages") + wordpress_imported_media = fields.Many2many('ir.attachment', string="Imported Media") + wordpress_imported_user_ids = fields.Many2many('res.users', string="Imported Users") + + def transfer_user(self, user_json): + """ For now this is only used by the blog so we can credit the original author """ + + external_identifier = "import_user_" + str(user_json['id']) + + #Create an external ID so we don't reimport the same user again + wordpress_user = self.env['ir.model.data'].xmlid_to_object('wordpress_import.' + external_identifier) + if wordpress_user: + #For now we don't reimport the users + _logger.error("User already exists") + else: + #Since we don't seem to get the username, email or password from the API we just create a stub user + wordpress_user = self.env['res.users'].create({'login': 'wordpress_' + str(user_json['id']), 'notify_email': 'none', 'email': 'wordpress_' + str(user_json['id']) + "@example.fake.au", 'name': user_json['name'], 'active':True}) + + #We need to keep track of any imported users + self.wordpress_imported_user_ids = [(4,wordpress_user.id)] + + self.env['ir.model.data'].create({'module': "wordpress_import", 'name': external_identifier, 'model': 'res.users', 'res_id': wordpress_user.id }) + + return wordpress_user + + def transfer_media(self, media_json): + """ Media can be imported from many places such as when importing pages, media library, blog posts or posts of any type """ + + url = media_json['guid']['rendered'] + + filename = url.split('/')[-1] + + external_identifier = "import_media_" + str(media_json['id']) + + #Create an external ID so we don't reimport the same media again + media_attachment = self.env['ir.model.data'].xmlid_to_object('wordpress_import.' + external_identifier) + if media_attachment: + #For now we don't reimport media to conserve bandwidth and speed up reimports + media_attachment.name = filename + else: + #Download the image and creat a public attachment + image_data = base64.b64encode( requests.get(url).content ) + media_attachment = self.env['ir.attachment'].create({'name':filename, 'type':'binary', 'datas':image_data, 'datas_fname': filename, 'res_model': 'ir.ui.view', 'public': True}) + + #We need to keep track of any imported media + self.wordpress_imported_media = [(4,media_attachment.id)] + + self.env['ir.model.data'].create({'module': "wordpress_import", 'name': external_identifier, 'model': 'ir.attachment', 'res_id': media_attachment.id }) + + return media_attachment + + def pagination_requests(self, url): + """Repeats the request multiple time until it has all pages""" + + response_string = requests.get(url + "?per_page=100&page=1") + combined_json_data = json.loads(response_string.text) + + if "X-WP-TotalPages" in response_string.headers: + total_pages = int(response_string.headers['X-WP-TotalPages']) + + if total_pages > 1: + for page in range(2, total_pages + 1 ): + response_string = requests.get(url + "?per_page=100&page=" + str(page) ) + combined_json_data = combined_json_data + json.loads(response_string.text) + + return combined_json_data + + def transform_post_content(self, content, media_json_data): + """ Changes Wordpress content of any post type(page, blog, custom) to better fit in with the Odoo CMS, includes localising hyperlinks and media """ + + root = html.fromstring(content) + image_tags = root.xpath("//img") + if len(image_tags) != 0: + for image_tag in image_tags: + + media_attachment = False + + #Get the full size image by looping through all media until you find the one with this url + for media_json in media_json_data: + if 'sizes' in media_json['media_details']: + for key, value in media_json['media_details']['sizes'].items(): + if value['source_url'] == image_tag.attrib['src'] or value['source_url'] == image_tag.attrib['src'].replace("/",'\/'): + media_attachment = self.transfer_media(media_json) + else: + if media_json['guid']['rendered'] == image_tag.attrib['src'] or media_json['guid']['rendered'] == image_tag.attrib['src'].replace("/",'\/'): + media_attachment = self.transfer_media(media_json) + + if media_attachment: + if "width" in image_tag.attrib and "height" in image_tag.attrib: + image_tag.attrib['src'] = "/web/image2/" + str(media_attachment.id) + "/" + image_tag.attrib['width'] + "x" + image_tag.attrib['height'] + "/" + str(media_attachment.name) + else: + image_tag.attrib['src'] = "/web/image/" + str(media_attachment.id) + + #Reimplement image resposiveness the Odoo way + if "class" in image_tag.attrib: + image_tag.attrib['class'] = "img-responsive " + image_tag.attrib['class'] + else: + image_tag.attrib['class'] = "img-responsive" + + #This gets moved into the src + if "width" in image_tag.attrib: + image_tag.attrib.pop("width") + + if "height" in image_tag.attrib: + image_tag.attrib.pop("height") + + #We only import the original image, not all size variants so this is meaningless + if "srcset" in image_tag.attrib: + image_tag.attrib.pop("srcset") + + if "sizes" in image_tag.attrib: + image_tag.attrib.pop("sizes") + + #Modify anchor tags and map pages to the new url + anchor_tags = root.xpath("//a") + if len(anchor_tags) != 0: + for anchor_tag in anchor_tags: + #Only modify local links + if "href" in anchor_tag.attrib: + if self.wordpress_url in anchor_tag.attrib['href']: + page_slug = anchor_tag.attrib['href'].split("/")[-2] + anchor_tag.attrib['href'] = "/" + page_slug + + transformed_content = etree.tostring(root, encoding='unicode') + + return transformed_content + + def import_media(self): + + media_json_data = self.pagination_requests(self.wordpress_url + "/wp-json/wp/v2/media") + + for media_json in media_json_data: + self.transfer_media(media_json) + + def import_pages(self): + + page_json_data = self.pagination_requests(self.wordpress_url + "/wp-json/wp/v2/pages") + + #Also get media since we will be importing the images in the post + media_json_data = self.pagination_requests(self.wordpress_url + "/wp-json/wp/v2/media") + + for page_json in page_json_data: + + title = page_json['title']['rendered'] + slug = page_json['slug'] + content = page_json['content']['rendered'] + + wraped_content = "" + wraped_content += "\n" + wraped_content += " \n" + wraped_content += "
\n" + wraped_content += "
\n" + wraped_content += content + wraped_content += "
\n" + wraped_content += " \n" + wraped_content += "" + + transformed_content = "\n" + self.transform_post_content(wraped_content, media_json_data) + _logger.error( str(transformed_content) ) + + external_identifier = "import_post_" + str(page_json['id']) + + #Create an external ID so we don't reimport the same page again + page_view = self.env['ir.model.data'].xmlid_to_object('wordpress_import.' + external_identifier) + if page_view: + #If the page has already been all we do is update it + page_view.arch_base = transformed_content + else: + + #Create the view first + external ID + new_view = self.env['ir.ui.view'].create({'name':slug, 'key':'website.' + slug, 'type': 'qweb', 'arch': transformed_content}) + self.env['ir.model.data'].create({'module': "wordpress_import", 'name': external_identifier, 'model': 'ir.ui.view', 'res_id': new_view.id }) + + #Now we create the page + self.env['website.page'].create({'wordpress_id': self.id, 'name': title, 'view_id': new_view.id, 'url': '/' + slug}) \ No newline at end of file diff --git a/migration_wordpress/models/website_page.py b/migration_wordpress/models/website_page.py new file mode 100644 index 000000000..ce6e6275b --- /dev/null +++ b/migration_wordpress/models/website_page.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models + +class WebsitePageMigrationWordpress(models.Model): + + _inherit = "website.page" + + wordpress_id = fields.Many2one('migration.import.wordpress', string="Wordpress Import") \ No newline at end of file diff --git a/migration_wordpress/security/ir.model.access.csv b/migration_wordpress/security/ir.model.access.csv new file mode 100644 index 000000000..00f5f4974 --- /dev/null +++ b/migration_wordpress/security/ir.model.access.csv @@ -0,0 +1,2 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_migration_import_wordpress","access migration.import.wordpress","model_migration_import_wordpress","wordpress_migration_group",1,1,1,1 \ No newline at end of file diff --git a/migration_wordpress/static/description/1.jpg b/migration_wordpress/static/description/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..646bdbffca11c7aabab1fe2fc7416bfd64781d9d GIT binary patch literal 99863 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

Nk#Sn=; z1&;zCDOI%7u7W4Z7}yj6md3pSaDvx$J#P+2od*z>f?L6~jZneLYJ{*ndj(0UIt6hb z>t&KiO=2n{9O3YcoKvyG0GAnEF7-GazX_z3$i-n_a*4offur}kr|$}ATMM014;S@& z^Fn8v-rJPWq_==Msl0hiXKvAAuBzaY^^ELUUDNQa_H2g%SQO9Krz_S+Hsjh0VQM;q zJ9X`&=&NJye150uc6o=lc{T`Pkq|k0lra;s9g0(`cb+%}s z42Y^D+3F5vFlz?~cUFG2>XhPDOGu_%aH}2U34QpYd7DT`7uK39$BhbHYLS6*uKotPdT3ynU#tIqnHPx;@!(b(SsCOb>c)K- zrjyF;W6CHlJd2%~oJULHIzfH4k?$audLq#cY_e2{`G{d8`ije)BKmwgC_x`84}E#U zl9$vDUt@Ia)A+lFNbl{_{C>~Wq`U-E>CIg+jF&vPW^8YgP&Diy8p}5AMHTl@ELRld zDdNfCsfLVx>!wIBK3I`-AK=bWDuGuwCWV`lNGY`vvC8TIiU6id{E^!+oWs=VOLP_p;wZB!y?=rqCto7)SO+# zCnRONXSTlGeC=$^;UyKuS0``LRM@jpo5jN`6zSWiFWtKeD$*vO6lq#SsS{PY1yHG9 zUTZ&_!dTvrH_cmi58Rf_Tv3ZwX-0qIXI3{l_HiwwSK!3w+V>KKMw?T)ziy&5t&(kx zH8d}3bkTWkNb>$kh4?-xkvSv$4j0UY``ENkpG@q8n7+^- zf4t{W1C}YOB84MiL9m9Fo3ZnR-R`zeESl%fpb1v{K@Zk(HMl}}-7at}xE7KPoQk*@ zXS=?AR#NuWQ$3@LtIK8KamGwPUX*Tw?*joUB3CNsd;s*xLFQ`uSv{6`kkr1Oa_v|& zUv!KAB71LDbc2pVKg|H{v&769?cTG+T#Xf8t%SP7j0x@W#(1}=?Yw|QfI$G>q))O^ zOZo{BCkZbruc)acoo0U)Do16ASH9Rk$k7;9`T z)vI3w-Ju^mO?}s2o{C(2%1tDnopU#LkW(6yAU?Qs{u5l=+d$W*4*+#ic?)kr-{ua> z%!02XwT36U=`{2888r@Oq-oz$uYTo#jnh9)01UA5ta2L0hUMk5!y(TV>;zpt$Fvli zd(9{kPp-Zgwu9U8)S~x*JRa+GE&Kof_hf%bxZdefB9<`xOVC z-55PLgeywvD!qT(F3+qw9(y(O=1k91d&i3P%M}FPYK=b0AsINdj|XA%!3pV}&c$yV zHzhII6X}Jov0Mp1vVU$xbwL^t;(3s{D(LDT{#wM|%aCO*B*k9G-H9SsJ=#6zEKXI4Tzk-L(MrH3B0k{*G{aoYA3)XvI}n z>(KGKdsj^ppYyUvUT+Vc|80hsB{Z&YZ43vI2!%Mm<6CNgG2phq)kAcNd@9!`&@1NtpstW zS-Pp~4afW37&qCEl2-}xjBd0$NkO?4KcSttRH{{lrR>S`e);rl~h zo~LNeDEUBR?lgsT8PoMh{D+$ zI$T5c35o&6gxrl&EbwOP2{zy>oTPey#uPhLhbzkr&JPPH68@*Z#d17Wg?)Pl0C9iM zJ!FmA5bdizc?c-uOzVwH(P~FOpBI+-F?Z!N|2**5JAlasBk`1VG%FQ&W2#KxocA|H z5&N+K9!|tw*1G;5wrGFMUgpOF6k4Z*a@6_3>RO&2Ra<9iyyf#OB^(rD^FL8BZ~}@K>ua%{cdj^zRsQlyJcNn zV(WEm=qe4im->wH>*m3a(G+-E=4GMPkOyIPnB?P78Ty@qM8!>K-*mGBExp8y)=TL# zkqMZ^<``rR_AZXhb=0}m5JBzZb!wY4XOSE!xXQWxpzksBxEgz%3FdikkyaOUzK9@s}WMGA$BZss)$HB)Rx+8;*?1q zmN8?bYm?;SGR)9?&%fU#pKC^8U1oVs z<+y=@%Br-Vc7+`K7j4Vy{U5r=PG&_`Qvs%f5MoyqSz%h6R9C}?Mg4b^Ka>nlbTX}7 zk8izctNKat>Exz>9?_=pt{!*UU;#HSm|#RhtMuAPt0S`;bxE`dwX0$KqOV?z6t0Y| zdoI;@Yh%w9T}$kzi4Wl(DJR48eq8P!x)F!L7A;j%Jy#E7Whb=}^cCUvVMcgu_3qXx zI5YzlQq*^;t(E(@b%i7lgPpRa!Gq&+Lf0$y7`7EFa{HB~r+)O3m9jzSeFFgl?J;4- z1h_R9TwQm3EmIrdD-_$PL%%YICvL4wZg8Mqv0$Z+b4sD9U)?EnQ_CGZy)Ebaa8x!klb z-?hI?F6{3=1bdPVpW`zL=P$(8OV9kAJ3^~NajQ0^bH5lTtVq>c6|~6QZ%Q>#cx9FE z-l^={$0hx+xEjudfi!^mxK^GEBx}@$ZA0TO<>PsUu}Hd7fu3-StRs4Vk8ORqbTHi_;5^hDQ3TgJ!ECY1-%`>XNKlBc__KSK9z z0}agR{plpVsC9G8{i?t-1;$kU{f$$?PVLbiG)60+1=zorNW7}V0A-LZJ;Ea`Ub3@R zeGyiv=hjXw!unPC1~|t;lmr&1R~9vKYAvUx5%_YLAHUSM-=G9`6>}`XdPik*zeY5O z@vs@mfP1UWOP#?=#BDV~mnr(iSxiQw`F>nL30Xtzf+Rz*`&`6B#~?qg&IjZFZXg{` z?KZgP3|}yI(oJjv{l@2>rwgEyMOp$_y$ersS)V-j#__w{x-S&Ch>nR}Eo8e{R~*}i z5^iG-Y`q0tk;ZqMK9u5Y8B{tfR0@$ZY5#<@m39cJfs3A4Xw?jX55*Q#oXr8tn=e|1 zCyRS|v#KHAB!KbrWCRhPv=_?9jrwe*JKJN%hHN!z;`-KOE$6@%sl=OhGUL-uW99jsF4%ik0wpTGw9*LimFxr2;TRgs6Q3xdGIMPkueP zL)ehS_I|!b8F+n<7~=`Vzq8^S2pWI}Sdgm{kCy5dH#1Ex?mnZ@?K$1m-#JvCANvOC z0cgR*UXwmol#=)!{WZmT^7EQe{);pM1)J)`4X~uLn~T^^FSut~0x~zt$w4jF%~Eo~ z{mxbPMYKD|(J9OJI(RYV8z}K}z&(Jp>(^MwFZa(A19fv=8|Q7~uijI5vr-`9Kkhbu z3Y+}G;R)<}{}4#}k6fUZ*2O%uN0-KdgV!4Xl1strD_zQOWzGH(1^HjnTwn$7nVua0 z83nPm9=|yiOJMxfD<^99OwyaSJ9g~KGd1QwC)Nb!&w@eYkVmG$Si@VFn7I6R5?Yf^ zy(6z}J>+$lh8{S(OunqrEgHFNvC|-RQ<=8yTXaA+P+ zS$p5}aVHEnt9}30!5gwrP2%C;kvU;g5w+dHni1TxZc`^LP9TTAOBFP}rOS5jmqV9- z>;F3i*{*lFbK_D6Sz>(l_@}&`B1uat)khq2-xYFjG=CCuv#hQVrjgsj&gYK9^oDdO z5^9viu&ufkzf0^0Ck;G;oJH6a-U_gCzg;*}0_|S!*8EVaZx)Ebge80NdbbdTfCfdW z8r8&|lJ_PbwDsgHaqbK$H-6j}!i&O`;hS&Kei;bKp*TWwAsbf1&>*oW}B2G9k}ml>FIgJ&zP14*tdA$Fc_WSAu_fur7#x5g8YM_lmYAf-Nd4r z+)2$#q7P%9?yRdJ3GO}Nr*kZnNhv^19Q?`$oJASy%f24Y zlyUsg82S-1hC*gr<_OyyeA<}ZXfu_7Vy?$_K0#`T+=E2VR(Gho%jwXvZuik%(3Gs0cO$9*X>1d-_xoM+3dE(Qd6v(b)~Ga6g1ptfTZDFu<01*3wRh2S?rvv>&B0FEP)D9#e%LR&q zN?g|EQPCB$u3}1ESoErFoJTFcVHW7AOMj*%zK^boZ-T>ZGqUrRN0ZB{D_)a25HixM zHa;TWBW`54?i&5bQuoo0lA0Sy<_9!NqeUFo2g^Hhv{x}k+h%1D^Zi>j7^3=yXoNGl z&9tAa*653|)`g?DR0RS(>G!1ewe#8cx3?Es26Z|4rJCqoP(4Q(Je#5#oQuUjE!)1UA`(jJZleh{b?xL^?TE!@m826mZ8 zMC(K`8pZi2tm($fj@FyeEcPCT+vv z2(;MU;8TY~uMfOJz)+=}t@|FSq=;K@R9Z2!$W|v~$D#O=&m60I_x9kWPL#@4D&k&G zX1lDEW%yo@sRI-uBwbz5nk%F4de*B4CQ6d2)q`t_Rb16@@^=|DduP!>>V-bSbJYfA^8p7~i;_)13(P8T?TBmw;L%vBNzsH^8D| z51uRo4h99j2m4ZjO|WdlcDfZ$_9v%hehFwjQ~pxlwTN~D7^l5QPg#Bqu|9$bd?W{K zI6VSl8>8UYRKJGIm1Vdv`4W#7na@saHdB8I&f#@$)EGnsq)> zoe#Kwn?e4^&Ktm5IP~}1b}q9N2-fcxBL7VMAEKZ8uYrv}vqJqwOC93}EL2whukM{Z zY#?LTXq|vYD0OxJ!u^Pgk9*U?FA|CJD|so%SrwQg%wV~a$MbWZ%MZ8N#ZRixC;qq{I|)`%-nA0%x< z=6(Ciu41n0xp|n*Pq;!S)v6JWX6%l`U1M5yQ7^7Xf9`1PRBq#^qYCA8T_|Of>W-XY zBj6xf64Z1f&(DKV-+2J3klZdcz37*8K=*WvCUGda&sDvdx0V@J5k6sQ$Z&&5+ThLe zIXe5CMe2`u!TlCP$Fr77%dzud!?iAB0u(=omd$6?@w&9ZS9ZP?h;< z)kWXni(Qba84kh(#;GDie$alg>(!BbiF%Nei`ZxXijA)-OEovsyhSg|5$-mM{m6gZt&!XHTcWb@oTker>`Q!-Q z2?pg?W-tJ4>gMk^>pyPX{}thD<74RwABH$LLtDBh#kron+Lnm49`CkAMZOq_K-h4W+589DA}7Z}#Sw}K(oR;8=vWRK~CzZ4s!a5WNP zN!$5C3ZwuP6>S}YGKHs#Z|3voYs=*Nt?zSpkl~r~ce^`0i9&bds#ZeRFQbMpe5&@j z+4J~%v)!Pxpi^rjWk6h8iuv3dO_P{@n;l{KPQ%`!(Zsj0|LQfUp8)50IgclhTHzL^uw?sW3hJy_Cw7}h-JG8kvuUQ z&RQ*n4E`3+YCm^4)tN0Tt5et8Q-*6TgLd+^x87-ulte)Y5(2vVDx} z=9y)k8kQ2ycGyv@B#DQC$b@m2)D;57(s%97)ZQW~i%H^5wc)9rey0I;=WUZ~z35cm zKHCR-0cHKDX6dG)5pS%=iu@YYKIx~o2lHA1jC>lZM2vS$f z(qAQ2H^Ap;oY@{`X-Yxe0v%Awq9otMx}4oOdS^7`zBiccL>gmbX>+M!_>*30gpi>a z`{mF3JvUyz8U_Hy~ePwa+DEA{Zrf}2f4(u%PwFmB=<@uE?JD6gMUrSMUw%1n` zeHs~Ok0N|oBTd#DaF96b;^aAkaKBP&2SA>ye{C*&wUf~8z0+M&Gl3QopABum8_*W zkch)Ze7};brCb^G_H=2}mgsI|nzQFDRj~j)cJd6&EVGM!%Ju+CTUD){m9~j0uP!&i zS{KSMJEHStjx0}T6dPw2UZ~U*7Rwx4E{lo|eg8V;PBR@Nxh<&8m@YUW$h=pf3-)}~ zL2yzW!S))8bvXjo7GfAh}QdNYa{jRpO&5PR`Pjlb2+9>>*H7 zk1@Qe4SaLKpw2N}BvzC-sk9uqaJ^VHanNM2g?86fg<7~DWq|644LY-viHp|eL-s{) z5^sn=qAgd11cJVA9ud_m+IgSp8AJHo0b6{;M*KjhwpkuZWdih>zlE49S}cYkHVVQ% zOcvoPCRtt?yPz$@`DK32xFXW!`Xol~qejIt1luK8IOoH(Q1X!@(KWeT?xzb8YURM} zs`8(;`2R`wu&e-^K47`~!{F}!02AZym&N~R{5$lh*B(>5==tSY|Gkv&WNJT~^%bnK zz>&14JNhRJA$P=%7U~YVco!BZg*2_L(=?J_dIwVv$FK@_8`I!Fh7epbT z|8Oa58CgmZ4=)}~gS;$ID2=Npe~!`Cu)K5i5eWWErl}o2iGH5#DCVI&wBVcj@9lE* z(mqLIjdxzY6s*Bg&p?nl7=&S&?D2CtnV)~RB1YJWB+uJ9Imt50x${dj5i(o0HP_0( z?oeHkIGg+S-N!V1N*(o^5=&+n!dc%yi?M)w4!0XHi1+XSo~P!!N|@)D&+Fvh(;&K6 zDYz;=XSFjIWxcfSL$^?7h4nItuTX((-A#$tE<&Gyce=nEvELiy@oiAg&s~@1=bK){ z|M8MqaZQL4Y-dW1aKq@5&rw-1InCJ9qU*mF%Iw!pj95zh@3i+lRoLZdH3i|^qe7gI zyjbH&zDGMx>J|S(r%egP`}HTjj}yJ(=U0CkFVE}Y|IQod_3%qQP;e_t8QlZ6COY z(1ApbJv4BO`TT0UUO?FCR)u`;42oF>I;2`uv_<-%h-{vB{i_bQMgs#4S8!*SvlcYY zD$m@7!fV?GUj85$qv1HjZm?o@+R6#l6NGa8!#EyL%& zJ-H&N+axI1kZW;oMBan}j&K~F<7z7had8@d_HE&BU$@g()aXyyEQF-MEBa?o@Ioo2 zYYo^9ua<^(#m^#``Gtp6`CdUsRmy5M_l}o8Nt)e-$k{B?H)XQ6Oi5tZT9mkwOdz!0 zC>Uras&B{2nY<#Ek!+vx^{>ao1i9pl*R2*F;g}mhQ!^|myz5f5M^}%-&l;nw)Y`1M`XQ`V7F zz>i?(j!tZY9a5*0e0u+# zu(cad1yM!p20POn?Xj^o?{TmFrMdUcB2_+B&QN;^oyEy?AtAu9Gn+Zp9^84n^bOQS z7Ih<=);dg@!4Rttf1i1)1c2rM_l!e({vyx&@Lq=PqOAdxHu&wpSe|-m6zX zTG2E2d#HE-U=agtu$~N?`3$}a2f_GAvx92{Z!t}RmB_ZgFb)$UYBdTJZ;C7}++FR$ zZPKIG*0ofL9h_Nf73Sk(Qkau&qJr8rbnJHX6YC$Ej6U34&vU}9IvKVu=v(W;lgNaJ zT79Xu6{mLrJvTBa$*0iuXrUkuUHt|cO=+IcgiZ`g;jtF^Xavp=&j#*d`#z`{@)A=# zq}vCJ4WTjcp@qCv#&+2~E;F(Pb5V+)@?Yn*OpvJElqPx9j`)e*k+phrZ+;?qdX+W* z(KxDL?j3oGBa7-W?T2j<%bV5oUN+PN89@c@FEVw7ghtO|jLZV4%7eCf{UiFRoD2LF zi~QvgR%=$od8AwKzFv>;5lYmu>-B2j2-x^ZF#TWdQ`50U6^?9h=BbYKXldK^|_rUp4r?`ZW)*Zrkg%vZ&*-1eaX73!0r|@~yhtFYOX) zQT?V7U6MBLgV3AB@^U`Q9=WKYtH2)v%cpDVHmi}7`{`rq z_78V%F_gb2HpPW!N(>dabv;DJ9}q1^JypoMES*T*)MZl8*RcpP{y>DS=dqA8rf_AM z&)q31+wO|!UWmM<{$wuIsZZc(TB2mD`%;8N8GJ2H?S_=iIvKFN23}ZyvGLbMLuKo`^Zi{O3r%gqvGJxz7^6TEh7r6+Rg(+vcFN? zNGp+By#4T^&C_PRkVd28sFl3}cE<8x^SS#zRLpmL9kv5!2lFi`9>Z^J>1&Lig|Bem zkGlV!0SbR0hx{-wZ5}(5!N?rf+gb^Ofdr`?Uvf@NN>K?T;b~}O$mDrM@aAh7A z0Ju7-m@mKysxIEVZi)9CZ_{HgBGx6iZb)(G>gtxj?v2UKH=>`A`5VY&6SLNMXAlGZ zC2)Y~UcuL~<=E~I-$2M4PvhWb>qMHIfzG6DdI4=HHSjb*z6ep>wJAN@Z0z1XHimlv z(93+CYDDdT%L}o%k~RAqqi~_^bi1M8QUTT=0A+BBnSi)!W8*2ta~j*cGRFGo`RIM5 zuVxV$_y&F5%PWo)x$@asE8)yNXOJDv;5p8S)9gxu2sgJRPN^JWQaDiuaoP;q6ZOZ4^*z}=oQ#1&L!+ulwn2e+gws{Q z-$0Trw{vrXWMujlYWvyQCXB82_su4(8gI8q=!s83Mcn($kXCzN1j9-PC+Ez3Qc+ao4C^kd4L)ti)tBvZB6`B`F^rCF7<~1sbMEz}TS&G? z>*$$TCGA|>h?X$?xkAT9Ow6SH6-yc!D>Yrt!AUKz$E^-jP%Z7X`zcT@$rWtsiX1g7 z4Vs?CBhpJJD=zSDU4=a9;wPK+QG{~E7q-Hm*^jJQCVyowSl`t!>NgA*3Vl=;L;m0= z;NxyvL(aCDi_+Lwd)kUgJNw7#;?fJ^RC~sA&l6ipxyMD>I20j$W5u$q6As}`@!?+W zd80Z>2W-kxB!8%a-9KtW`h7ZX;7GRV_p8sprctbK44h@tc+~fOk-E(sL$2~@u{`Mt zv1&;1)gu%$S_n<-^$y%)F19tfnJ*9u+5LMrQe!amAjSJPzkx&m%x^3B^Y@1x=vaHz zM4QAGOA`+_4wZjM6Kr(J{Z8xf+tdAsZy;*GPwacDFFu7*8YkBPi&`Iewr*PHheQIQ zBulxp2DCd!#Z#A4mLC#vUZ^24T$4n5$bAC=eeL!4L<{2TDS5w^BK3zfRBczz3v~X4 zfQEVAIN3=iYg@JgDgz_KcLI$ff_E`u&MNExp1KjS4WL;z_5LQ- zca}4W_Gkq(+aRI?fcCM-EO1iZ3}W7&Z#}~_0>UBRK-Xn{6O-T11s`qDp6#=osMehx zgrHA|L5ZW$w7d8b=wq={1==6N97w>6cCi|KFr114T%L9@?fE`Y6dz+ZV4PXIIV z7WZ!=brt}>2^7G`O&Wy2fIVH0>o?Fwu{h3e-ub))*U!Jfc`G{a$)NLoa6X!z&uG95 zeLf$Y&j;u8!FfM8UtOQ?aDLjc{jZ!4FpB?#j4t3^qoEb^YCxI)c=wC_!B(YshWYK8^TsQygu15dCF>qGAXr- z$t|`rhJN^RIwAvS-7!`(Cso*lV^VH}(swRjY$aRrhS^IGO>N;9d~}L*s`Z^W_wMki zS1NdDnB2YQIa(aN%Vu@vSPs??3jPF{nH%J3?i-w71(*gzo@>OteP{4cc>aSe!PS?J zxqMnJ$!Xq z*orNms;P;KUBw>n6wr7L_I`>|r6f-J9EefBCp;vO22OIF*#8Dfb8(L^<8n7O5H{Vx z6Pr?1(DF<<;S+jOT_)dD>hUgWLF#U3G{!JN8i&dqi>Y38?-oI;y0?m2)f8^i6%(6vf5K;v9HyEXSQlaMu6mS!9Q949&cv>;itAo(B0CZWN^9b$L!s|?e`o**7 z+OCz41m|vty=hT06UE-jVi$K&Qp^6Q|rA zb3N-i)9j<+6K*2O`L&bLj`&3YNtEgSH6>(q7c+2+CUigQYo5Awh(|%QVB0&4cW^3G zx>?#Yi=nrTR>DJEmheO*XOFd&^l){WY{&$Lgm6UvV$rhp2j#xW!9iN!lu~DX`@)zsl~Q2=cQuBYU$=_S=YIcUrWPV4 zsL2%2O*(!Oh9A`2H-4E|hVor?H5~{f{X~%({HQ1K^MrF^j&{K3aDCmgg4O1KN7_;g!Jr|e^I2t^meux731#ie#l#v!aActrQ-RQM zizsbZ?fV-@@Eq~V2q0E7IKv68cIt8O*b0uBGjrcNh*un?_jSJ1pb!+eD7?rsq^z*Q znEciy(nMi4FyD@-zAp8a4ZQurugiajm%j%yqLt^_p)|M{Y#gK~k!lSHXy`Mz z#c?HaboGp%as_kg@(^Pr7^ek@n4r&$$2dso=tqL$h=VH@1@<$RVxJ)&KCK@z@NkZq zd+nK@PqT1WLO`fO)UR|Y32)Vkehq!Ic0l-S(h|aQn*VX6L>PE0(GQgi;Q#`OE#S-7 zjXRyUvaIs*$c$(%w^6y|Utz&aR3w;`&(l~DjLP57ESb1?`z3u~E<2)S#$jEK=5qyQ z4P21bELN}3R`N?WK^S8J`^}?Wnw8?i!)$DK%M4q*S+#ZD7TYvma_hKU3tHB*QUb<5F$Cza_5_u z`P&m9D8wISzBCz0YpE!Gn)Q>g&H1C})pXt@&U?=JDDf{E5yeRW2E%_LU9Cy(Z&(CN y&b_$*KsWsVX`bxAg#~ElAVW_5*1v&P1HOTlnDV~ +

Description

+

Copies content from Wordpress CMS into Odoo

+

*NOTE* Uses version 2 of the REST API which requires that the Wordpress website you are importing is atleast 4.7

+

*NOTE* Theme HTML, CSS and plugin functionality does not get moved over this can result in very different appearences between the two websites

+ +Wordpress to Odoo +

Import Media Library

+

Copies all media from the Wordpress media library into the Odoo media library

+ +

Import Pages

+

Copies the page content from Wordpress, importing images in the process and updating hyperlinks to there Odoo equivalent

+

Plugins and CSS do not get moved over so some degree of reworking the content for Odoo is still neccassary

+
+ +Find a bug? feature idea? send an email to steven@sythiltech.com.au
+
\ No newline at end of file diff --git a/migration_wordpress/views/menus.xml b/migration_wordpress/views/menus.xml new file mode 100644 index 000000000..56307e405 --- /dev/null +++ b/migration_wordpress/views/menus.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/migration_wordpress/views/migration_import_wordpress_views.xml b/migration_wordpress/views/migration_import_wordpress_views.xml new file mode 100644 index 000000000..b169fe21b --- /dev/null +++ b/migration_wordpress/views/migration_import_wordpress_views.xml @@ -0,0 +1,48 @@ + + + + + + migration.import.wordpress form view + migration.import.wordpress + +
+
+
+ + + + + + + + + + + + +
+
+
+ + + migration.import.wordpress tree view + migration.import.wordpress + + + + + + + + + Wordpress Import + migration.import.wordpress + form + tree,form + + +
+
\ No newline at end of file From f7a828a3c7b39c4f9ee4574db05db25fa50aade4 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Tue, 24 Oct 2017 15:33:47 +1100 Subject: [PATCH 002/228] port blog import to v11 port blog import to v11 --- .../models/migration_import_wordpress.py | 2 - migration_wordpress/static/description/1.jpg | Bin 99863 -> 140837 bytes .../migration_import_wordpress_views.xml | 4 +- migration_wordpress_blog/__init__.py | 3 + migration_wordpress_blog/__manifest__.py | 20 +++++ migration_wordpress_blog/doc/changelog.rst | 3 + migration_wordpress_blog/doc/index.rst | 6 ++ migration_wordpress_blog/models/__init__.py | 3 + .../models/migration_import_wordpress.py | 70 ++++++++++++++++++ .../static/description/1.jpg | Bin 0 -> 140837 bytes .../static/description/index.html | 12 +++ .../migration_import_wordpress_views.xml | 20 +++++ 12 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 migration_wordpress_blog/__init__.py create mode 100644 migration_wordpress_blog/__manifest__.py create mode 100644 migration_wordpress_blog/doc/changelog.rst create mode 100644 migration_wordpress_blog/doc/index.rst create mode 100644 migration_wordpress_blog/models/__init__.py create mode 100644 migration_wordpress_blog/models/migration_import_wordpress.py create mode 100644 migration_wordpress_blog/static/description/1.jpg create mode 100644 migration_wordpress_blog/static/description/index.html create mode 100644 migration_wordpress_blog/views/migration_import_wordpress_views.xml diff --git a/migration_wordpress/models/migration_import_wordpress.py b/migration_wordpress/models/migration_import_wordpress.py index 32d155ef2..a0072bf24 100644 --- a/migration_wordpress/models/migration_import_wordpress.py +++ b/migration_wordpress/models/migration_import_wordpress.py @@ -175,8 +175,6 @@ def import_pages(self): wraped_content += "
" transformed_content = "\n" + self.transform_post_content(wraped_content, media_json_data) - _logger.error( str(transformed_content) ) - external_identifier = "import_post_" + str(page_json['id']) #Create an external ID so we don't reimport the same page again diff --git a/migration_wordpress/static/description/1.jpg b/migration_wordpress/static/description/1.jpg index 646bdbffca11c7aabab1fe2fc7416bfd64781d9d..e88d5cbbe5508da7a9080b4ce4304c1a3626253a 100644 GIT binary patch literal 140837 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 J0p`)b{{x%Kt+oIF literal 99863 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

Nk#Sn=; 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

-
diff --git a/migration_wordpress_blog/__init__.py b/migration_wordpress_blog/__init__.py new file mode 100644 index 000000000..5305644df --- /dev/null +++ b/migration_wordpress_blog/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models \ No newline at end of file diff --git a/migration_wordpress_blog/__manifest__.py b/migration_wordpress_blog/__manifest__.py new file mode 100644 index 000000000..1635ebb14 --- /dev/null +++ b/migration_wordpress_blog/__manifest__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Wordpress Migration - Blog Posts", + 'version': "1.0", + 'author': "Sythil Tech", + 'category': "Tools", + 'support': "steven@sythiltech.com.au", + 'summary': "Copies Wordpress blog posts and comments into Odoo", + 'description': "Copies Wordpress blog posts and comments into Odoo", + 'license':'LGPL-3', + 'data': [ + 'views/migration_import_wordpress_views.xml', + ], + 'demo': [], + 'depends': ['migration_wordpress', 'website_blog'], + 'images':[ + 'static/description/1.jpg', + ], + 'installable': True, +} \ No newline at end of file diff --git a/migration_wordpress_blog/doc/changelog.rst b/migration_wordpress_blog/doc/changelog.rst new file mode 100644 index 000000000..aae8652f1 --- /dev/null +++ b/migration_wordpress_blog/doc/changelog.rst @@ -0,0 +1,3 @@ +v1.0 +==== +* Port to v11 \ No newline at end of file diff --git a/migration_wordpress_blog/doc/index.rst b/migration_wordpress_blog/doc/index.rst new file mode 100644 index 000000000..71e1b546b --- /dev/null +++ b/migration_wordpress_blog/doc/index.rst @@ -0,0 +1,6 @@ +Import Blog Posts +1. Go to Migration top level menu +2. Create a new record and enter the URL of your Wordpress website (no credentials needed) +3. Hit "Import Blog Posts", this will copy the raw content of the page, transforming any image / link URLs in the process. +*NOTE* Due to theme styles and javascript not being transferred over, most pages will NOT retain thier original appearance. +In most cases a redesign will be neccassary however this module still saves time having to manually transfer resources. \ No newline at end of file diff --git a/migration_wordpress_blog/models/__init__.py b/migration_wordpress_blog/models/__init__.py new file mode 100644 index 000000000..2e494a444 --- /dev/null +++ b/migration_wordpress_blog/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import migration_import_wordpress \ No newline at end of file diff --git a/migration_wordpress_blog/models/migration_import_wordpress.py b/migration_wordpress_blog/models/migration_import_wordpress.py new file mode 100644 index 000000000..eecf0c48f --- /dev/null +++ b/migration_wordpress_blog/models/migration_import_wordpress.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +import requests +import logging +_logger = logging.getLogger(__name__) +import json +import html + +from odoo import api, fields, models + +class MigrationImportWordpressBlog(models.Model): + + _inherit = "migration.import.wordpress" + + blog_post_ids = fields.Many2many('blog.post', string="Imported Blog Posts") + + def import_posts(self): + _logger.error("Import Posts") + + #Get Posts + blog_json_data = self.pagination_requests(self.wordpress_url + "/wp-json/wp/v2/posts") + + #Also get media since we will be importing the images in the post + media_json_data = self.pagination_requests(self.wordpress_url + "/wp-json/wp/v2/media") + + #Get Posts + tax_response_string = requests.get(self.wordpress_url + "/wp-json/wp/v2/posts") + tax_json_data = json.loads(tax_response_string.text) + + for blog_json in blog_json_data: + title = html.unescape(blog_json['title']['rendered']) + slug = blog_json['slug'] + content = blog_json['content']['rendered'] + status = blog_json['status'] + + wraped_content = "" + wraped_content += "
\n" + wraped_content += content.strip() + wraped_content += "
" + + transformed_content = self.transform_post_content(wraped_content, media_json_data) + + #Translate Wordpress published status to the Odoo one + published = False + if status == "publish": + published = True + + external_identifier = "import_post_" + str(blog_json['id']) + + #Create an external ID so we don't reimport the same post again + blog_post = self.env['ir.model.data'].xmlid_to_object('wordpress_import.' + external_identifier) + if blog_post: + #Update the blog post + blog_post.content = transformed_content + else: + #We also get the Wordpress user and import it if neccassary + wordpress_user = self.env['ir.model.data'].xmlid_to_object('wordpress_import.import_user_' + str(blog_json['author']) ) + if wordpress_user: + _logger.error("TODO implement reimport user code") + else: + _logger.error( str(blog_json['author']) ) + user_response_string = requests.get(self.wordpress_url + "/wp-json/wp/v2/users/" + str(blog_json['author']) ) + user_json = json.loads(user_response_string.text) + wordpress_user = self.transfer_user(user_json) + + #Create the blog post if it does not exist + blog_post = self.env['blog.post'].sudo(wordpress_user.id).create({'author_id': wordpress_user.partner_id.id, 'write_uid': wordpress_user.id, 'blog_id':1, 'name':title, 'content': transformed_content, 'website_published': published}) + + self.env['ir.model.data'].create({'module': "wordpress_import", 'name': external_identifier, 'model': 'blog.post', 'res_id': blog_post.id }) + self.blog_post_ids = [(4,blog_post.id)] diff --git a/migration_wordpress_blog/static/description/1.jpg b/migration_wordpress_blog/static/description/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e88d5cbbe5508da7a9080b4ce4304c1a3626253a GIT binary patch literal 140837 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 J0p`)b{{x%Kt+oIF literal 0 HcmV?d00001 diff --git a/migration_wordpress_blog/static/description/index.html b/migration_wordpress_blog/static/description/index.html new file mode 100644 index 000000000..8099d9d94 --- /dev/null +++ b/migration_wordpress_blog/static/description/index.html @@ -0,0 +1,12 @@ +
+

Description

+

Extends the core module to also import blog posts

+ +Wordpress Blog Posts to Odoo +Import Blog Posts +

Copies the blog content from Wordpress, importing images in the process and updating hyperlinks to there Odoo equivalent

+

Plugins and CSS do not get moved over so some degree of reworking the content for Odoo is still neccassary

+
+ +Find a bug? feature idea? send an email to steven@sythiltech.com.au
+
\ No newline at end of file diff --git a/migration_wordpress_blog/views/migration_import_wordpress_views.xml b/migration_wordpress_blog/views/migration_import_wordpress_views.xml new file mode 100644 index 000000000..3366f47fa --- /dev/null +++ b/migration_wordpress_blog/views/migration_import_wordpress_views.xml @@ -0,0 +1,20 @@ + + + + + + migration.import.wordpress form view inherit blog + migration.import.wordpress + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website_support/views/website_support_ticket_views.xml b/website_support/views/website_support_ticket_views.xml new file mode 100644 index 000000000..cb5690551 --- /dev/null +++ b/website_support/views/website_support_ticket_views.xml @@ -0,0 +1,131 @@ + + + + + + website.support.ticket.form.view + website.support.ticket + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + website.support.ticket.form.search + website.support.ticket + + + + + + + + + + + + website.support.ticket.form.graph + website.support.ticket + + + + + + + + + website.support.ticket tree view + website.support.ticket + + + + + + + + + + + + + + + + + Support Tickets + website.support.ticket + tree,form,graph + +

+ No Support Tickets found +

+
+
+ + + Support Tickets + website.support.ticket + tree,form,graph + {"search_default_unattended_tickets":1, 'auto_refresh': 1, 'default_create_user_id': uid} + +

+ No Support Tickets found +

+
+
+ + + + + +
+
\ No newline at end of file From 403e9daf2f8b19325938fa639525fb86794d8901 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Sun, 11 Feb 2018 20:11:42 +1100 Subject: [PATCH 010/228] * Forward fix custom field mismatch * Forward fix custom field mismatch --- website_support/__manifest__.py | 2 +- website_support/doc/changelog.rst | 231 +----------------- .../models/website_support_ticket.py | 2 +- 3 files changed, 4 insertions(+), 231 deletions(-) diff --git a/website_support/__manifest__.py b/website_support/__manifest__.py index 9fac35e22..28b895727 100644 --- a/website_support/__manifest__.py +++ b/website_support/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Website Help Desk / Support Ticket", - 'version': "1.5.5", + 'version': "1.0.1", 'author': "Sythil Tech", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/website_support/doc/changelog.rst b/website_support/doc/changelog.rst index 2e922a9cb..b1e9f8fa0 100644 --- a/website_support/doc/changelog.rst +++ b/website_support/doc/changelog.rst @@ -1,234 +1,7 @@ -v1.5.5 -====== -* Additional fields depending on selected sub category -* Hide blank one2many fields to keep support ticket view small - -v1.5.4 -====== -* Fix blank attachments issue -* Fix public no permision to create attachment issue -* Allow download of attachments from backend - -v1.5.3 -====== -* Order help groups -* Order help pages -* Publish / unpublish help groups -* Publish / unpublish help pages -* Force style of help groups and helps pages so design is consistant across different themes -* Limit access to help groups to particular groups - -v1.5.2 -====== -* Fix "Support Ticket Reply Wrapper (support@)" email from - -v1.5.1 -====== -* Few extra report stats - -v1.5.0 -====== -* Departments which are a grouping of support users with assigned managers for reporting - -v1.4.24 -======= -* Auto send survey setting - -v1.4.23 -======= -* Read only rating and comment -* Readd portal key for logged in users since it's used by survey - -v1.4.22 -======= -* State assignable email - -v1.4.21 -======= -* Sub category sequence - -v1.4.20 -======= -* Help group access only to certain contacts - -v1.4.19 -======= -* Create user account setting - -v1.4.18 -======= -* Help group access groups - -v1.4.17 -======= -* Category sequence - -v1.4.16 -======= -* Closed by user field - -v1.4.15 -======= -* Mail template field - -v1.4.14 -======= -* Hidden create user field - -v1.4.13 -======= -* Add multiple attachments to support tickets + settings to limit quantity and filesize - -v1.4.12 -======= -* Close wizard using python window action - -v1.4.11 -======= -* Remove new ticket in category email from chatter - -v1.4.10 -======= -* Logged in users that submit tickets via the website no longer get website portal access (security precaution since website portal doesn't require any login) - -v1.4.9 -====== -* Remove message button in chatter since it bypasses reply code - -v1.4.8 -====== -* support email template fix -* conversation history from is based on person_name or email not create_uid - -v1.4.7 -====== -* Fix bug with multi ticket access allow only allowing single extra access - -v1.4.6 -====== -* Restrict Customer Support menu to only the "Sales / Manager" and Sales / Users: All Docuemnts" - -v1.4.5 -====== -* Use comapany email in all cases - -v1.4.4 -====== -* Filter out system emails and make it easier to create new email templates - -v1.4.3 -====== -* Send email when user is assigned - -v1.4.2 -====== -* Restrict support ticket menu to employee only since sometimes portal could gain access? - -v1.4.1 -====== -* Compatablity with web_list_autorefresh module - -v1.4 -==== -* Setting to change staff reply email template - -v1.3.9 -====== -* Prevent tickets with no partner displaying in website portal - -v1.3.8 -====== -* Render HTML ticket description in website portal - -v1.3.7 -====== -* Default category for email ticket setting -* Public website portal access to tickets created via email -* Support ticket manager access field -* Add group by category and user - -v1.3.6 -====== -* Close email template setting -* Change categories, priorities and state to not update so changes are preserved across versions -* Ticket survey now uses images to represent rating - -v1.3.5 -====== -* Fix email sanitisation issue - -v1.3.4 -====== -* close ticket permission fix - -v1.3.3 -====== -* close ticket comment - -v1.3.2 -====== -* Sub categories permission fix - -v1.3.1 -====== -* Sub categories on website form - -v1.3 -==== -* Sub categories and support survey - -v1.2.10 -======= -* Blank category staff reply fix - -v1.2.9 -====== -* Manual html sanitise - -v1.2.8 -====== -* Remove readonly restrictions - -v1.2.7 -====== -* Remove required and create restrictions - -v1.2.6 -====== -* Fix support ticket by email - -v1.2.5 -====== -* Added help page menu and help page count fix - -v1.2.4 -====== -* translate help pages name fix - -v1.2.3 -====== -* translate help pages fix - -v1.2.2 -====== -* category email not replacing placeholders - -v1.2.1 -====== -* non employee user permission fix - -v1.2 -==== -* Transfer revamp changes from v9 - -v1.1 -==== -* Transfer ticket number and priority coloring from v9 - v1.0.1 ====== -* Version 10 fixes +* Forward fix custom field mismatch v1.0 ==== -* Version 10 upgrade \ No newline at end of file +* Port to version 11 \ No newline at end of file diff --git a/website_support/models/website_support_ticket.py b/website_support/models/website_support_ticket.py index f53b56d45..74f011376 100644 --- a/website_support/models/website_support_ticket.py +++ b/website_support/models/website_support_ticket.py @@ -227,7 +227,7 @@ class WebsiteSupportTicketField(models.Model): _name = "website.support.ticket.field" - wst_id = fields.Many2one('website.support.ticket.field', string="Support Ticket") + wst_id = fields.Many2one('website.support.ticket', string="Support Ticket") name = fields.Char(string="Label") value = fields.Char(string="Value") From ff003cfd72647e642dbc807eaebb89aa2d70ec2b Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Tue, 13 Feb 2018 14:27:04 +1100 Subject: [PATCH 011/228] forward fix many2one casting issue forward fix many2one casting issue --- html_form_builder/controllers/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html_form_builder/controllers/main.py b/html_form_builder/controllers/main.py index 991a1df3c..da1d2e947 100644 --- a/html_form_builder/controllers/main.py +++ b/html_form_builder/controllers/main.py @@ -818,7 +818,7 @@ def _process_html_dropbox(self, field, field_data, values): elif field.field_id.ttype == "many2one": html_response.error = "" - html_response.return_data = field_data + html_response.return_data = int(field_data) html_response.history_data = field_data return html_response From 209489848d25ea7c02b1eea6e8e6dcfccdf757ed Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Wed, 14 Feb 2018 20:13:42 +1100 Subject: [PATCH 012/228] port to version 11 port to version 11 --- voip_sip_webrtc/__init__.py | 4 + voip_sip_webrtc/__manifest__.py | 41 + voip_sip_webrtc/controllers/__init__.py | 4 + voip_sip_webrtc/controllers/bus.py | 29 + voip_sip_webrtc/controllers/main.py | 181 +++++ voip_sip_webrtc/data/ir.cron.xml | 17 + voip_sip_webrtc/data/mail.message.subtype.csv | 2 + .../data/voip.account.action.type.csv | 3 + voip_sip_webrtc/data/voip.codec.csv | 4 + voip_sip_webrtc/data/voip_ringtone.xml | 10 + voip_sip_webrtc/data/voip_settings.xml | 18 + voip_sip_webrtc/doc/changelog.rst | 3 + voip_sip_webrtc/models/__init__.py | 18 + voip_sip_webrtc/models/ir_actions_server.py | 23 + voip_sip_webrtc/models/res_partner.py | 49 ++ voip_sip_webrtc/models/res_users.py | 18 + voip_sip_webrtc/models/sdp.py | 36 + voip_sip_webrtc/models/sip.py | 370 +++++++++ voip_sip_webrtc/models/voip_account.py | 331 ++++++++ voip_sip_webrtc/models/voip_account_action.py | 73 ++ voip_sip_webrtc/models/voip_call.py | 443 +++++++++++ voip_sip_webrtc/models/voip_call_template.py | 167 ++++ .../models/voip_call_template_preview.py | 28 + voip_sip_webrtc/models/voip_codec.py | 16 + voip_sip_webrtc/models/voip_media.py | 11 + .../models/voip_message_compose.py | 45 ++ .../models/voip_message_template.py | 12 + voip_sip_webrtc/models/voip_ringtone.py | 12 + voip_sip_webrtc/models/voip_server.py | 329 ++++++++ voip_sip_webrtc/models/voip_settings.py | 51 ++ voip_sip_webrtc/models/voip_voip.py | 81 ++ voip_sip_webrtc/security/ir.model.access.csv | 4 + voip_sip_webrtc/static/description/1.jpg | Bin 0 -> 71818 bytes voip_sip_webrtc/static/description/2.jpg | Bin 0 -> 60447 bytes voip_sip_webrtc/static/description/3.jpg | Bin 0 -> 62596 bytes voip_sip_webrtc/static/description/icon.png | Bin 0 -> 1373 bytes voip_sip_webrtc/static/description/index.html | 20 + voip_sip_webrtc/static/src/audio/blank.mp3 | Bin 0 -> 107291 bytes .../static/src/audio/old_school_ringtone.mp3 | Bin 0 -> 230712 bytes .../static/src/css/notification.css | 49 ++ voip_sip_webrtc/static/src/js/notification.js | 725 ++++++++++++++++++ .../static/src/js/sip-0.8.3.min.js | 38 + .../static/src/js/voip_system_tray.js | 103 +++ voip_sip_webrtc/static/src/xml/sip_widget.xml | 11 + .../static/src/xml/voip_notification.xml | 44 ++ .../static/src/xml/voip_window.xml | 30 + .../views/ir_actions_server_views.xml | 28 + voip_sip_webrtc/views/menus.xml | 14 + voip_sip_webrtc/views/res_partner_views.xml | 30 + voip_sip_webrtc/views/res_users_views.xml | 23 + voip_sip_webrtc/views/voip_account_views.xml | 70 ++ .../voip_call_template_preview_views.xml | 27 + .../views/voip_call_template_views.xml | 60 ++ voip_sip_webrtc/views/voip_call_views.xml | 62 ++ voip_sip_webrtc/views/voip_media_views.xml | 44 ++ .../views/voip_message_compose_views.xml | 25 + .../views/voip_message_template_views.xml | 39 + voip_sip_webrtc/views/voip_ringtone_views.xml | 40 + voip_sip_webrtc/views/voip_settings_views.xml | 30 + .../views/voip_sip_webrtc_templates.xml | 13 + 60 files changed, 3958 insertions(+) create mode 100644 voip_sip_webrtc/__init__.py create mode 100644 voip_sip_webrtc/__manifest__.py create mode 100644 voip_sip_webrtc/controllers/__init__.py create mode 100644 voip_sip_webrtc/controllers/bus.py create mode 100644 voip_sip_webrtc/controllers/main.py create mode 100644 voip_sip_webrtc/data/ir.cron.xml create mode 100644 voip_sip_webrtc/data/mail.message.subtype.csv create mode 100644 voip_sip_webrtc/data/voip.account.action.type.csv create mode 100644 voip_sip_webrtc/data/voip.codec.csv create mode 100644 voip_sip_webrtc/data/voip_ringtone.xml create mode 100644 voip_sip_webrtc/data/voip_settings.xml create mode 100644 voip_sip_webrtc/doc/changelog.rst create mode 100644 voip_sip_webrtc/models/__init__.py create mode 100644 voip_sip_webrtc/models/ir_actions_server.py create mode 100644 voip_sip_webrtc/models/res_partner.py create mode 100644 voip_sip_webrtc/models/res_users.py create mode 100644 voip_sip_webrtc/models/sdp.py create mode 100644 voip_sip_webrtc/models/sip.py create mode 100644 voip_sip_webrtc/models/voip_account.py create mode 100644 voip_sip_webrtc/models/voip_account_action.py create mode 100644 voip_sip_webrtc/models/voip_call.py create mode 100644 voip_sip_webrtc/models/voip_call_template.py create mode 100644 voip_sip_webrtc/models/voip_call_template_preview.py create mode 100644 voip_sip_webrtc/models/voip_codec.py create mode 100644 voip_sip_webrtc/models/voip_media.py create mode 100644 voip_sip_webrtc/models/voip_message_compose.py create mode 100644 voip_sip_webrtc/models/voip_message_template.py create mode 100644 voip_sip_webrtc/models/voip_ringtone.py create mode 100644 voip_sip_webrtc/models/voip_server.py create mode 100644 voip_sip_webrtc/models/voip_settings.py create mode 100644 voip_sip_webrtc/models/voip_voip.py create mode 100644 voip_sip_webrtc/security/ir.model.access.csv create mode 100644 voip_sip_webrtc/static/description/1.jpg create mode 100644 voip_sip_webrtc/static/description/2.jpg create mode 100644 voip_sip_webrtc/static/description/3.jpg create mode 100644 voip_sip_webrtc/static/description/icon.png create mode 100644 voip_sip_webrtc/static/description/index.html create mode 100644 voip_sip_webrtc/static/src/audio/blank.mp3 create mode 100644 voip_sip_webrtc/static/src/audio/old_school_ringtone.mp3 create mode 100644 voip_sip_webrtc/static/src/css/notification.css create mode 100644 voip_sip_webrtc/static/src/js/notification.js create mode 100644 voip_sip_webrtc/static/src/js/sip-0.8.3.min.js create mode 100644 voip_sip_webrtc/static/src/js/voip_system_tray.js create mode 100644 voip_sip_webrtc/static/src/xml/sip_widget.xml create mode 100644 voip_sip_webrtc/static/src/xml/voip_notification.xml create mode 100644 voip_sip_webrtc/static/src/xml/voip_window.xml create mode 100644 voip_sip_webrtc/views/ir_actions_server_views.xml create mode 100644 voip_sip_webrtc/views/menus.xml create mode 100644 voip_sip_webrtc/views/res_partner_views.xml create mode 100644 voip_sip_webrtc/views/res_users_views.xml create mode 100644 voip_sip_webrtc/views/voip_account_views.xml create mode 100644 voip_sip_webrtc/views/voip_call_template_preview_views.xml create mode 100644 voip_sip_webrtc/views/voip_call_template_views.xml create mode 100644 voip_sip_webrtc/views/voip_call_views.xml create mode 100644 voip_sip_webrtc/views/voip_media_views.xml create mode 100644 voip_sip_webrtc/views/voip_message_compose_views.xml create mode 100644 voip_sip_webrtc/views/voip_message_template_views.xml create mode 100644 voip_sip_webrtc/views/voip_ringtone_views.xml create mode 100644 voip_sip_webrtc/views/voip_settings_views.xml create mode 100644 voip_sip_webrtc/views/voip_sip_webrtc_templates.xml diff --git a/voip_sip_webrtc/__init__.py b/voip_sip_webrtc/__init__.py new file mode 100644 index 000000000..e89927ca6 --- /dev/null +++ b/voip_sip_webrtc/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import controllers \ No newline at end of file diff --git a/voip_sip_webrtc/__manifest__.py b/voip_sip_webrtc/__manifest__.py new file mode 100644 index 000000000..b27c94849 --- /dev/null +++ b/voip_sip_webrtc/__manifest__.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Voip Communication", + 'version': "1.0", + 'author': "Sythil Tech", + 'category': "Tools", + 'support': "steven@sythiltech.com.au", + 'summary': "Make video calls with other users inside your system", + 'license':'LGPL-3', + 'data': [ + 'views/voip_sip_webrtc_templates.xml', + 'views/res_users_views.xml', + 'views/voip_call_views.xml', + 'views/voip_call_template_preview_views.xml', + 'views/voip_call_template_views.xml', + 'views/voip_ringtone_views.xml', + 'views/voip_account_views.xml', + 'views/voip_settings_views.xml', + 'views/res_partner_views.xml', + 'views/voip_media_views.xml', + 'views/voip_message_compose_views.xml', + 'views/ir_actions_server_views.xml', + 'views/voip_message_template_views.xml', + 'views/menus.xml', + 'security/ir.model.access.csv', + 'data/voip_ringtone.xml', + 'data/voip_settings.xml', + 'data/voip.codec.csv', + 'data/voip.account.action.type.csv', + 'data/ir.cron.xml', + 'data/mail.message.subtype.csv', + ], + 'demo': [], + 'depends': ['web','crm','bus'], + 'qweb': ['static/src/xml/*.xml'], + 'images':[ + 'static/description/1.jpg', + 'static/description/2.jpg', + ], + 'installable': True, +} \ No newline at end of file diff --git a/voip_sip_webrtc/controllers/__init__.py b/voip_sip_webrtc/controllers/__init__.py new file mode 100644 index 000000000..afffdb590 --- /dev/null +++ b/voip_sip_webrtc/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import main +from . import bus \ No newline at end of file diff --git a/voip_sip_webrtc/controllers/bus.py b/voip_sip_webrtc/controllers/bus.py new file mode 100644 index 000000000..b828e0ede --- /dev/null +++ b/voip_sip_webrtc/controllers/bus.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -* + +from odoo.addons.bus.controllers.main import BusController +from odoo.http import request + + +class VoipBusController(BusController): + # -------------------------- + # Extends BUS Controller Poll + # -------------------------- + def _poll(self, dbname, channels, last, options): + if request.session.uid: + + #Callee receives notication asking to accept or reject the call plus media permission, Caller receives a notification showing how much time left before call is missed + channels.append((request.db, 'voip.notification', request.env.user.partner_id.id)) + + #Both the caller and callee are notified if the call is accepted, rejected or the call is ended early by the caller, the voip window then shows + channels.append((request.db, 'voip.response', request.env.user.partner_id.id)) + + #Season Description Procotol + channels.append((request.db, 'voip.sdp', request.env.user.partner_id.id)) + + #ICE + channels.append((request.db, 'voip.ice', request.env.user.partner_id.id)) + + #End the call + channels.append((request.db, 'voip.end', request.env.user.partner_id.id)) + + return super(VoipBusController, self)._poll(dbname, channels, last, options) diff --git a/voip_sip_webrtc/controllers/main.py b/voip_sip_webrtc/controllers/main.py new file mode 100644 index 000000000..2a8e96a59 --- /dev/null +++ b/voip_sip_webrtc/controllers/main.py @@ -0,0 +1,181 @@ +# -*- coding: utf-8 -*- +import requests +import json +import datetime +import logging +_logger = logging.getLogger(__name__) +import werkzeug.utils +import werkzeug.wrappers +import werkzeug +import base64 +import socket +from ast import literal_eval +import struct + +from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT +from openerp.tools import ustr +import openerp.http as http +from openerp.http import request + +class VoipController(http.Controller): + + @http.route('/voip/ringtone/.mp3', type="http", auth="user") + def voip_ringtone(self, voip_call_id): + """Return the ringtone file to be used by javascript""" + + voip_call = request.env['voip.call'].browse( int(voip_call_id) ) + to_user = request.env['res.users'].search([('partner_id','=',voip_call.partner_id.id)]) + + #Check if the callee has a person ringtone set + if to_user.voip_ringtone: + ringtone_media = to_user.voip_ringtone + else: + voip_ringtone_id = request.env['ir.default'].get('voip.settings', 'ringtone_id') + voip_ringtone = request.env['voip.ringtone'].browse( voip_ringtone_id ) + ringtone_media = voip_ringtone.media + + headers = [] + ringtone_base64 = base64.b64decode(ringtone_media) + headers.append(('Content-Length', len(ringtone_base64))) + response = request.make_response(ringtone_base64, headers) + + return response + + @http.route('/voip/messagebank/', type="http", auth="user") + def voip_messagebank(self, voip_call_id): + """ Allow listen to call in browser """ + + voip_call = request.env['voip.call'].browse( int(voip_call_id) ) + + html = "" + + if voip_call.server_stream_data: + html += "Server Stream:
" + html += "
\n" + + for voip_client in voip_call.client_ids: + html += "Client " + voip_client.name + " Stream
" + html += "
\n" + + return html + + @http.route('/voip/messagebank/client/.wav', type="http", auth="user") + def voip_messagebank_client(self, voip_call_client_id): + """ Allow listen to call in browser """ + + voip_call_client = request.env['voip.call.client'].browse( int(voip_call_client_id) ) + voip_call = voip_call_client.vc_id + + headers = [] + audio_stream = base64.b64decode(voip_call_client.audio_stream) + + #Add a RIFF wrapper to the raw file so we can play the audio in the browser, this is just a crude solution for those that don't have transcoding installed + if voip_call_client.vc_id.media_filename == "call.raw": + #"RIFF" + riff_wrapper = "52 49 46 46" + #File Size + riff_wrapper += " " + struct.pack('.wav', type="http", auth="user") + def voip_messagebank_server(self, voip_call_id): + """ Audio generated by the server """ + + voip_call = request.env['voip.call'].browse( int(voip_call_id) ) + + headers = [] + audio_stream = base64.b64decode(voip_call.server_stream_data) + + #Add a RIFF wrapper to the raw file so we can play the audio in the browser, this is just a crude solution for those that don't have transcoding installed + if voip_call.media_filename == "call.raw": + #"RIFF" + riff_wrapper = "52 49 46 46" + #File Size + riff_wrapper += " " + struct.pack('.mp3', type="http", auth="user") + def voip_miss_message(self, voip_call_id): + """ Play the missed call mp3 of the callee """ + + voip_call = request.env['voip.call'].browse( int(voip_call_id) ) + to_user = request.env['res.users'].search([('partner_id','=',voip_call.partner_id.id)]) + + if to_user.voip_missed_call: + missed_call_media = to_user.voip_missed_call + + headers = [] + missed_call_media_base64 = base64.b64decode(missed_call_media) + headers.append(('Content-Length', len(missed_call_media_base64))) + response = request.make_response(missed_call_media_base64, headers) + + return response + else: + #TODO read blank.mp3 and return it + return "" \ No newline at end of file diff --git a/voip_sip_webrtc/data/ir.cron.xml b/voip_sip_webrtc/data/ir.cron.xml new file mode 100644 index 000000000..59cdab663 --- /dev/null +++ b/voip_sip_webrtc/data/ir.cron.xml @@ -0,0 +1,17 @@ + + + + + + Clear Messagebank + + code + model.clear_messagebank() + 24 + hours + -1 + + + + + \ No newline at end of file diff --git a/voip_sip_webrtc/data/mail.message.subtype.csv b/voip_sip_webrtc/data/mail.message.subtype.csv new file mode 100644 index 000000000..f860a79fe --- /dev/null +++ b/voip_sip_webrtc/data/mail.message.subtype.csv @@ -0,0 +1,2 @@ +"id","name","default" +"voip_call","VOIP Call","0" \ No newline at end of file diff --git a/voip_sip_webrtc/data/voip.account.action.type.csv b/voip_sip_webrtc/data/voip.account.action.type.csv new file mode 100644 index 000000000..fe865e092 --- /dev/null +++ b/voip_sip_webrtc/data/voip.account.action.type.csv @@ -0,0 +1,3 @@ +"id","name","internal_name" +"recorded","Recorded Message","recorded_message" +"call_user","Call User","call_user" \ No newline at end of file diff --git a/voip_sip_webrtc/data/voip.codec.csv b/voip_sip_webrtc/data/voip.codec.csv new file mode 100644 index 000000000..38945bc0c --- /dev/null +++ b/voip_sip_webrtc/data/voip.codec.csv @@ -0,0 +1,4 @@ +"id","name","payload_type","sample_rate","payload_size","sample_interval","supported","encoding","sdp_data","riff_audio_encoding_value" +"g_711_alaw","G.711 aLaw","8","8000","160","20","1","a-law","","6" +"pcmu","G.711 uLaw","0","8000","160","20","1","u-law","a=rtpmap:0 PCMU/8000\r\na=ptime:20\r\n","7" +"gsm","GSM","3","8000","33","20","1","gsm","","31" \ No newline at end of file diff --git a/voip_sip_webrtc/data/voip_ringtone.xml b/voip_sip_webrtc/data/voip_ringtone.xml new file mode 100644 index 000000000..1acb29ea6 --- /dev/null +++ b/voip_sip_webrtc/data/voip_ringtone.xml @@ -0,0 +1,10 @@ + + + + + Old School Ringtone + Old School Ringtone.mp3 + + + + \ No newline at end of file diff --git a/voip_sip_webrtc/data/voip_settings.xml b/voip_sip_webrtc/data/voip_settings.xml new file mode 100644 index 000000000..20079354d --- /dev/null +++ b/voip_sip_webrtc/data/voip_settings.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/voip_sip_webrtc/doc/changelog.rst b/voip_sip_webrtc/doc/changelog.rst new file mode 100644 index 000000000..aae8652f1 --- /dev/null +++ b/voip_sip_webrtc/doc/changelog.rst @@ -0,0 +1,3 @@ +v1.0 +==== +* Port to v11 \ No newline at end of file diff --git a/voip_sip_webrtc/models/__init__.py b/voip_sip_webrtc/models/__init__.py new file mode 100644 index 000000000..d9f70e346 --- /dev/null +++ b/voip_sip_webrtc/models/__init__.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from . import voip_voip +from . import res_users +from . import res_partner +from . import voip_call +from . import voip_ringtone +from . import voip_settings +from . import voip_server +from . import voip_account +from . import voip_account_action +from . import voip_message_compose +from . import voip_codec +from . import voip_call_template +from . import ir_actions_server +from . import voip_call_template_preview +from . import voip_media +from . import voip_message_template \ No newline at end of file diff --git a/voip_sip_webrtc/models/ir_actions_server.py b/voip_sip_webrtc/models/ir_actions_server.py new file mode 100644 index 000000000..127c0f115 --- /dev/null +++ b/voip_sip_webrtc/models/ir_actions_server.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from openerp import api, fields, models + +class IrActionsServer(models.Model): + + _inherit = 'ir.actions.server' + + voip_call_template_id = fields.Many2one('voip.call.template',string="VOIP Call Template") + + @api.model + def _get_states(self): + res = super(IrActionsServer, self)._get_states() + res.insert(0, ('voip_call', 'Make Voip Call')) + return res + + @api.model + def run_action_voip_call(self, action, eval_context=None): + if not action.voip_call_template_id: + return False + + action.voip_call_template_id.make_call(self.env.context.get('active_id')) + + return False diff --git a/voip_sip_webrtc/models/res_partner.py b/voip_sip_webrtc/models/res_partner.py new file mode 100644 index 000000000..a19874174 --- /dev/null +++ b/voip_sip_webrtc/models/res_partner.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +from openerp import api, fields, models +from openerp.exceptions import UserError + +class ResPartnerVoip(models.Model): + + _inherit = "res.partner" + + sip_address = fields.Char(string="SIP Address") + xmpp_address = fields.Char(string="XMPP Address") + + @api.onchange('country_id','mobile') + def _onchange_mobile(self): + """Tries to convert a local number to e.164 format based on the partners country, don't change if already in e164 format""" + if self.mobile: + + if self.country_id and self.country_id.phone_code: + if self.mobile.startswith("0"): + self.mobile = "+" + str(self.country_id.phone_code) + self.mobile[1:].replace(" ","") + elif self.mobile.startswith("+"): + self.mobile = self.mobile.replace(" ","") + else: + self.mobile = "+" + str(self.country_id.phone_code) + self.mobile.replace(" ","") + else: + self.mobile = self.mobile.replace(" ","") + + + @api.multi + def sip_action(self): + self.ensure_one() + + my_context = {'default_type': 'sip', 'default_model':'res.partner', 'default_record_id':self.id, 'default_to_address': self.sip_address} + + #Use the first SIP account you find + default_voip_account = self.env['voip.account'].search([]) + if default_voip_account: + my_context['default_sip_account_id'] = default_voip_account[0].id + else: + raise UserError("No SIP accounts found, can not send message") + + return { + 'name': 'SIP Compose', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'voip.message.compose', + 'target': 'new', + 'type': 'ir.actions.act_window', + 'context': my_context + } diff --git a/voip_sip_webrtc/models/res_users.py b/voip_sip_webrtc/models/res_users.py new file mode 100644 index 000000000..a4fa244a4 --- /dev/null +++ b/voip_sip_webrtc/models/res_users.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from datetime import datetime, timedelta +from openerp.http import request +import socket +import logging +_logger = logging.getLogger(__name__) + +from openerp import api, fields, models + +class ResUsersVoip(models.Model): + + _inherit = "res.users" + + voip_ringtone = fields.Binary(string="Ringtone") + voip_account_id = fields.Many2one('voip.account', string="SIP Account") + voip_ringtone_filename = fields.Char(string="Ringtone Filename") + voip_missed_call = fields.Binary(string="Missed Call Message") + voip_missed_call_filename = fields.Char(string="Missed Call Message Filename") \ No newline at end of file diff --git a/voip_sip_webrtc/models/sdp.py b/voip_sip_webrtc/models/sdp.py new file mode 100644 index 000000000..ef5d7f54d --- /dev/null +++ b/voip_sip_webrtc/models/sdp.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +import time + +def generate_sdp(self, ip, audio_port, rtp_profiles, session_description=" "): + + sdp = "" + + #Protocol Version ("v=") https://tools.ietf.org/html/rfc4566#section-5.1 (always 0 for us) + sdp += "v=0\r\n" + + #Origin ("o=") https://tools.ietf.org/html/rfc4566#section-5.2 + username = "-" + sess_id = int(time.time()) + sess_version = 0 + nettype = "IN" + addrtype = "IP4" + sdp += "o=" + username + " " + str(sess_id) + " " + str(sess_version) + " " + nettype + " " + addrtype + " " + ip + "\r\n" + + #Session Name ("s=") https://tools.ietf.org/html/rfc4566#section-5.3 + sdp += "s=" + session_description + "\r\n" + + #Connection Information ("c=") https://tools.ietf.org/html/rfc4566#section-5.7 + sdp += "c=" + nettype + " " + addrtype + " " + ip + "\r\n" + + #Timing ("t=") https://tools.ietf.org/html/rfc4566#section-5.9 + sdp += "t=0 0\r\n" + + #Media Descriptions ("m=") https://tools.ietf.org/html/rfc4566#section-5.14 + sdp += "m=audio " + str(audio_port) + " RTP/AVP" + for rtp_profile in rtp_profiles: + sdp += " " + str(rtp_profile) + sdp += "\r\n" + + sdp += "a=sendrecv\r\n" + + return sdp \ No newline at end of file diff --git a/voip_sip_webrtc/models/sip.py b/voip_sip_webrtc/models/sip.py new file mode 100644 index 000000000..c9e3f6725 --- /dev/null +++ b/voip_sip_webrtc/models/sip.py @@ -0,0 +1,370 @@ +# -*- coding: utf-8 -*- +import sys +import socket +import re +import random +import hashlib +import threading +import logging +_logger = logging.getLogger(__name__) + +class SIPSession: + + USER_AGENT = "Ragnarok" + rtp_threads = [] + sip_history = {} + + def __init__(self, ip, username, domain, password, auth_username=False, outbound_proxy=False, account_port="5060", display_name="-"): + self.ip = ip + self.username = username + self.domain = domain + self.password = password + self.auth_username = auth_username + self.outbound_proxy = outbound_proxy + self.account_port = account_port + self.display_name = display_name + self.call_accepted = EventHook() + self.call_rejected = EventHook() + self.call_ended = EventHook() + self.call_error = EventHook() + self.call_ringing = EventHook() + self.message_sent = EventHook() + self.message_received = EventHook() + + #Each account is bound to a different port + self.sipsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.sipsocket.bind(('', 0)) + self.bind_port = self.sipsocket.getsockname()[1] + + #Don't block the main thread with all the listening + sip_listener_starter = threading.Thread(target=self.sip_listener, args=()) + sip_listener_starter.start() + + def H(self, data): + return hashlib.md5(data).hexdigest() + + def KD(self, secret, data): + return self.H(secret + ":" + data) + + def http_auth(self, authheader, method, address): + realm = re.findall(r'realm="(.*?)"', authheader)[0] + uri = "sip:" + address + nonce = re.findall(r'nonce="(.*?)"', authheader)[0] + + if self.auth_username: + username = self.auth_username + else: + username = self.username + + A1 = username + ":" + realm + ":" + self.password + A2 = method + ":" + uri + + if "qop=" in authheader: + qop = re.findall(r'qop="(.*?)"', authheader)[0] + nc = "00000001" + cnonce = ''.join([random.choice('0123456789abcdef') for x in range(32)]) + response = self.KD( self.H(A1), nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + self.H(A2) ) + return 'Digest username="' + username + '",realm="' + realm + '",nonce="' + nonce + '",uri="' + uri + '",response="' + response + '",cnonce="' + cnonce + '",nc=' + nc + ',qop=auth,algorithm=MD5' + "\r\n" + else: + response = self.KD( self.H(A1), nonce + ":" + self.H(A2) ) + return 'Digest username="' + username + '",realm="' + realm + '",nonce="' + nonce + '",uri="' + uri + '",response="' + response + '",algorithm=MD5' + "\r\n" + + def answer_call(self, sip_invite, sdp): + + call_id = re.findall(r'Call-ID: (.*?)\r\n', sip_invite)[0] + call_from = re.findall(r'From: (.*?)\r\n', sip_invite)[0] + call_to = re.findall(r'To: (.*?)\r\n', sip_invite)[0] + + reply = "" + reply += "SIP/2.0 200 OK\r\n" + for (via_heading) in re.findall(r'Via: (.*?)\r\n', sip_invite): + reply += "Via: " + via_heading + "\r\n" + record_route = re.findall(r'Record-Route: (.*?)\r\n', sip_invite)[0] + reply += "Record-Route: " + record_route + "\r\n" + reply += "Contact: \r\n" + reply += "To: " + call_to + "\r\n" + reply += "From: " + call_from + "\r\n" + reply += "Call-ID: " + str(call_id) + "\r\n" + reply += "CSeq: 1 INVITE\r\n" + reply += "Allow: SUBSCRIBE, NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO, OPTIONS, MESSAGE\r\n" + reply += "Content-Type: application/sdp\r\n" + reply += "Supported: replaces\r\n" + reply += "User-Agent: " + str(self.USER_AGENT) + "\r\n" + reply += "Content-Length: " + str(len(sdp)) + "\r\n" + reply += "\r\n" + reply += sdp + + self.sipsocket.sendto(reply, (self.to_server, self.account_port) ) + + def send_sip_message(self, to_address, message_body): + call_id = ''.join([random.choice('0123456789abcdef') for x in range(32)]) + + message_string = "" + message_string += "MESSAGE sip:" + str(self.username) + "@" + str(self.domain) + " SIP/2.0\r\n" + message_string += "Via: SIP/2.0/UDP " + str(self.ip) + ":" + str(self.bind_port) + ";rport\r\n" + message_string += "Max-Forwards: 70\r\n" + message_string += 'To: ;messagetype=IM\r\n" + message_string += 'From: "' + str(self.display_name) + '"\r\n" + message_string += "Call-ID: " + str(call_id) + "\r\n" + message_string += "CSeq: 1 MESSAGE\r\n" + message_string += "Allow: SUBSCRIBE, NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO, OPTIONS, MESSAGE\r\n" + message_string += "Content-Type: text/html\r\n" + message_string += "User-Agent: " + str(self.USER_AGENT) + "\r\n" + message_string += "Content-Length: " + str(len(message_body)) + "\r\n" + message_string += "\r\n" + message_string += message_body + + if self.outbound_proxy: + to_server = self.outbound_proxy + else: + to_server = self.domain + + self.sipsocket.sendto(message_string, (to_server, self.account_port) ) + self.sip_history[call_id] = [] + self.sip_history[call_id].append(message_string) + return call_id + + def send_sip_register(self, register_address, register_frequency=3600): + + call_id = ''.join([random.choice('0123456789abcdef') for x in range(32)]) + + register_string = "" + register_string += "REGISTER sip:" + self.domain + ":" + str(self.account_port) + " SIP/2.0\r\n" + register_string += "Via: SIP/2.0/UDP " + str(self.ip) + ":" + str(self.bind_port) + ";rport\r\n" + register_string += "Max-Forwards: 70\r\n" + register_string += "Contact: \r\n" + register_string += 'To: "' + str(self.display_name) + '"\r\n" + register_string += 'From: "' + str(self.display_name) + '"\r\n" + register_string += "Call-ID: " + str(call_id) + "\r\n" + register_string += "CSeq: 1 REGISTER\r\n" + register_string += "Expires: " + str(register_frequency) + "\r\n" + register_string += "Allow: NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO, OPTIONS, MESSAGE\r\n" + register_string += "User-Agent: " + str(self.USER_AGENT) + "\r\n" + register_string += "Content-Length: 0\r\n" + register_string += "\r\n" + + if self.outbound_proxy: + self.to_server = self.outbound_proxy + else: + self.to_server = self.domain + + self.sip_history[call_id] = [] + self.sip_history[call_id].append(register_string) + + #Reregister to keep the session alive + reregister_starter = threading.Thread(target=self.reregister, args=(register_string, register_frequency,)) + reregister_starter.start() + + def reregister(self, register_string, register_frequency): + self.sipsocket.sendto(register_string, (self.to_server, self.account_port) ) + time.sleep(register_frequency) + self.reregister(register_string, register_frequency) + + def send_sip_invite(self, to_address, call_sdp): + + call_id = ''.join([random.choice('0123456789abcdef') for x in range(32)]) + + invite_string = "" + invite_string += "INVITE sip:" + to_address + ":" + str(self.account_port) + " SIP/2.0\r\n" + invite_string += "Via: SIP/2.0/UDP " + str(self.ip) + ":" + str(self.bind_port) + ";rport\r\n" + invite_string += "Max-Forwards: 70\r\n" + invite_string += "Contact: \r\n" + invite_string += 'To: \r\n" + invite_string += 'From: "' + str(self.display_name) + '"\r\n" + invite_string += "Call-ID: " + str(call_id) + "\r\n" + invite_string += "CSeq: 1 INVITE\r\n" + invite_string += "Allow: SUBSCRIBE, NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO, OPTIONS, MESSAGE\r\n" + invite_string += "Content-Type: application/sdp\r\n" + invite_string += "Supported: replaces\r\n" + invite_string += "User-Agent: " + str(self.USER_AGENT) + "\r\n" + invite_string += "Content-Length: " + str(len(call_sdp)) + "\r\n" + invite_string += "\r\n" + invite_string += call_sdp + + to_server = "" + if self.outbound_proxy: + to_server = self.outbound_proxy + else: + to_server = self.domain + + self.sipsocket.sendto(invite_string, (to_server, self.account_port) ) + self.sip_history[call_id] = [] + self.sip_history[call_id].append(invite_string) + return call_id + + def sip_listener(self): + + try: + + #Wait and send back the auth reply + stage = "WAITING" + while stage == "WAITING": + data, addr = self.sipsocket.recvfrom(2048) + _logger.error(data) + + #Send auth response if challenged + if data.split("\r\n")[0] == "SIP/2.0 407 Proxy Authentication Required" or data.split("\r\n")[0] == "SIP/2.0 407 Proxy Authentication required": + + authheader = re.findall(r'Proxy-Authenticate: (.*?)\r\n', data)[0] + call_id = re.findall(r'Call-ID: (.*?)\r\n', data)[0] + cseq = re.findall(r'CSeq: (.*?)\r\n', data)[0] + cseq_number = cseq.split(" ")[0] + cseq_type = cseq.split(" ")[1] + call_to_full = re.findall(r'To: (.*?)\r\n', data)[0] + call_to = re.findall(r'', call_to_full)[0] + if ":" in call_to: call_to = call_to.split(":")[0] + + #Resend the initial message but with the auth_string + reply = self.sip_history[call_id][0] + auth_string = self.http_auth(authheader, cseq_type, call_to) + + #Add one to sequence number + reply = reply.replace("CSeq: " + str(cseq_number) + " ", "CSeq: " + str(int(cseq_number) + 1) + " ") + + #Add the Proxy Authorization line before the User-Agent line + idx = reply.index("User-Agent:") + reply = reply[:idx] + "Proxy-Authorization: " + auth_string + reply[idx:] + + self.sipsocket.sendto(reply, addr) + elif data.split("\r\n")[0] == "SIP/2.0 401 Unauthorized": + + authheader = re.findall(r'WWW-Authenticate: (.*?)\r\n', data)[0] + call_id = re.findall(r'Call-ID: (.*?)\r\n', data)[0] + cseq = re.findall(r'CSeq: (.*?)\r\n', data)[0] + cseq_number = cseq.split(" ")[0] + cseq_type = cseq.split(" ")[1] + call_to_full = re.findall(r'To: (.*?)\r\n', data)[0] + call_to = re.findall(r'', call_to_full)[0] + if ":" in call_to: call_to = call_to.split(":")[0] + + #Resend the initial message but with the auth_string + reply = self.sip_history[call_id][0] + auth_string = self.http_auth(authheader, cseq_type, call_to) + + #Add one to sequence number + reply = reply.replace("CSeq: " + str(cseq_number) + " ", "CSeq: " + str(int(cseq_number) + 1) + " ") + + #Add the Authorization line before the User-Agent line + idx = reply.index("User-Agent:") + reply = reply[:idx] + "Authorization: " + auth_string + reply[idx:] + + _logger.error(reply) + self.sipsocket.sendto(reply, addr) + elif data.split("\r\n")[0] == "SIP/2.0 403 Forbidden": + #Likely means call was rejected + self.call_rejected.fire(self, data) + stage = "Forbidden" + return False + elif data.startswith("MESSAGE"): + #Extract the actual message to make things easier for devs + message = data.split("\r\n\r\n")[1] + if "\r\n" + ringing += "To: " + call_to + "\r\n" + ringing += "From: " + call_from + "\r\n" + ringing += "Call-ID: " + str(call_id) + "\r\n" + ringing += "CSeq: 1 INVITE\r\n" + ringing += "User-Agent: " + str(self.USER_AGENT) + "\r\n" + ringing += "Allow-Events: talk, hold\r\n" + ringing += "Content-Length: 0\r\n" + ringing += "\r\n" + + self.sipsocket.sendto(ringing, addr) + + self.call_ringing.fire(self, data) + elif data.startswith("BYE"): + #Do stuff when the call is ended by client + self.call_ended.fire(data) + stage = "BYE" + return True + elif data.split("\r\n")[0] == "SIP/2.0 200 OK": + + cseq = re.findall(r'CSeq: (.*?)\r\n', data)[0] + cseq_type = cseq.split(" ")[1] + + #200 OK is used by REGISTER, INVITE and MESSAGE, so the code logic gets split up + if cseq_type == "INVITE": + cseq_number = cseq.split(" ")[0] + contact_header = re.findall(r'Contact: <(.*?)>\r\n', data)[0] + record_route = re.findall(r'Record-Route: (.*?)\r\n', data)[0] + call_from = re.findall(r'From: (.*?)\r\n', data)[0] + call_to = re.findall(r'To: (.*?)\r\n', data)[0] + call_id = re.findall(r'Call-ID: (.*?)\r\n', data)[0] + + #Send the ACK + reply = "" + reply += "ACK " + contact_header + " SIP/2.0\r\n" + reply += "Via: SIP/2.0/UDP " + str(self.ip) + ":" + str(self.bind_port) + ";rport\r\n" + reply += "Max-Forwards: 70\r\n" + reply += "Route: " + record_route + "\r\n" + reply += "Contact: \r\n" + reply += 'To: ' + call_to + "\r\n" + reply += "From: " + call_from + "\r\n" + reply += "Call-ID: " + str(call_id) + "\r\n" + reply += "CSeq: " + str(cseq_number) + " ACK\r\n" + reply += "User-Agent: " + str(self.USER_AGENT) + "\r\n" + reply += "Content-Length: 0\r\n" + reply += "\r\n" + + self.sipsocket.sendto(reply, addr) + + self.call_accepted.fire(self, data) + elif cseq_type == "MESSAGE": + self.message_sent.fire(self, data) + elif data.split("\r\n")[0].startswith("SIP/2.0 4"): + self.call_error.fire(self, data) + + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + _logger.error(e) + _logger.error("Line: " + str(exc_tb.tb_lineno) ) + +class EventHook(object): + + def __init__(self): + self.__handlers = [] + + def __iadd__(self, handler): + self.__handlers.append(handler) + return self + + def __isub__(self, handler): + self.__handlers.remove(handler) + return self + + def fire(self, *args, **keywargs): + for handler in self.__handlers: + handler(*args, **keywargs) + + def clearObjectHandlers(self, inObject): + for theHandler in self.__handlers: + if theHandler.im_self == inObject: + self -= theHandler \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_account.py b/voip_sip_webrtc/models/voip_account.py new file mode 100644 index 000000000..5f7d24d98 --- /dev/null +++ b/voip_sip_webrtc/models/voip_account.py @@ -0,0 +1,331 @@ +# -*- coding: utf-8 -*- +import socket +from openerp.exceptions import UserError +import logging +_logger = logging.getLogger(__name__) +from openerp.http import request +import re +import hashlib +import random +from openerp import api, fields, models +from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT +import threading +from threading import Timer +import time +from time import sleep +import datetime +import struct +import base64 +from . import sdp +from . import sip +from random import randint + +class VoipAccount(models.Model): + + _name = "voip.account" + + name = fields.Char(string="Name", required="True") + state = fields.Selection([('new','New'), ('inactive','Inactive'), ('active','Active')], default="new", string="State") + type = fields.Selection([('sip', 'SIP'), ('xmpp', 'XMPP')], default="sip", string="Account Type") + address = fields.Char(string="SIP Address", required="True") + password = fields.Char(string="SIP Password", required="True") + auth_username = fields.Char(string="Auth Username") + username = fields.Char(string="Username", required="True") + domain = fields.Char(string="Domain", required="True") + voip_display_name = fields.Char(string="Display Name", default="Odoo") + outbound_proxy = fields.Char(string="Outbound Proxy") + port = fields.Integer(string="Port", default="5060") + verified = fields.Boolean(string="Verified") + wss = fields.Char(string="WSS", default="wss://edge.sip.onsip.com") + bind_port = fields.Integer(string="Bind Port") + action_id = fields.Many2one('voip.account.action', string="Call Action") + + @api.onchange('username','domain') + def _onchange_username(self): + if self.username and self.domain: + self.address = self.username + "@" + self.domain + + @api.onchange('address') + def _onchange_address(self): + if self.address: + if "@" in self.address: + self.username = self.address.split("@")[0] + self.domain = self.address.split("@")[1] + + def H(self, data): + return hashlib.md5(data).hexdigest() + + def KD(self, secret, data): + return self.H(secret + ":" + data) + + def generate_rtp_packet(self, audio_stream, codec_id, packet_count, sequence_number, timestamp): + + rtp_data = "" + + #---- Compose RTP packet to send back--- + #10.. .... = Version: RFC 1889 Version (2) + #..0. .... = Padding: False + #...0 .... = Extension: False + #.... 0000 = Contributing source identifiers count: 0 + rtp_data += "80" + + #0... .... = Marker: False + #Payload type + if packet_count == 0: + #ulaw + rtp_data += " 80" + else: + rtp_data += " " + format( codec_id.payload_type, '02x') + + rtp_data += " " + format( sequence_number, '04x') + + rtp_data += " " + format( int(timestamp), '08x') + + #Synchronization Source identifier: 0x1202763d + rtp_data += " 12 20 76 3d" + + #Payload: + payload_data = audio_stream[packet_count * codec_id.payload_size : packet_count * codec_id.payload_size + codec_id.payload_size] + hex_string = "" + + for rtp_char in payload_data: + hex_format = "{0:02x}".format(ord(rtp_char)) + hex_string += hex_format + " " + + rtp_data += " " + hex_string + return rtp_data.replace(" ","").decode('hex') + + def rtp_server_listener(self, rtc_sender_thread, rtpsocket, voip_call_client_id, model=False, record_id=False): + #Create the call with the audio + with api.Environment.manage(): + # As this function is in a new thread, I need to open a new cursor, because the old one may be closed + new_cr = self.pool.cursor() + self = self.with_env(self.env(cr=new_cr)) + + audio_stream = "" + call_start_time = datetime.datetime.now() + + try: + + #Call starts now + #voip_call_client = self.env['voip.call.client'].browse( int(voip_call_client_id) ) + #voip_call_client.vc_id.write({'status':"active", 'start_time': datetime.datetime.now()}) + + _logger.error("Start RTP Listening") + + t = threading.currentThread() + while getattr(t, "stream_active", True): + + rtpsocket.settimeout(10) + data, addr = rtpsocket.recvfrom(2048) + #Add the RTP payload to the received data + audio_stream += data[12:] + + except Exception as e: + #Timeout + _logger.error(e) + + try: + + #Update call after the stream times out + voip_call_client = self.env['voip.call.client'].browse( int(voip_call_client_id) ) + voip_call_client.vc_id.write({'media': base64.b64encode(audio_stream), 'status': 'over', 'media_filename': "call.raw", 'start_time': call_start_time, 'end_time': datetime.datetime.now()}) + diff_time = datetime.datetime.now() - call_start_time + voip_call_client.vc_id.duration = str(diff_time.seconds) + " Seconds" + + #Add the stream data to this client + voip_call_client.write({'audio_stream': base64.b64encode(audio_stream)}) + + #Have to manually commit the new cursor? + self._cr.commit() + self._cr.close() + + #if model: + # self.env[model].browse( int(record_id) ).message_post(body="Call Made", subject="Call Made", message_type="comment", subtype='voip_sip_webrtc.voip_call') + + #Kill the sending thread + rtc_sender_thread.stream_active = False + rtc_sender_thread.join() + + except Exception as e: + _logger.error(e) + + + def rtp_server_sender(self, rtpsocket, rtp_ip, rtp_port, audio_stream, codec_id, voip_call_client_id): + + #Create the call with the audio + with api.Environment.manage(): + # As this function is in a new thread, I need to open a new cursor, because the old one may be closed + new_cr = self.pool.cursor() + self = self.with_env(self.env(cr=new_cr)) + + server_stream_data = "" + + try: + + packet_count = 0 + sequence_number = randint(29161, 30000) + timestamp = (datetime.datetime.utcnow() - datetime.datetime(1900, 1, 1, 0, 0, 0)).total_seconds() + + t = threading.currentThread() + while getattr(t, "stream_active", True): + + #Send audio data out every 20ms + server_stream_data += audio_stream[packet_count * codec_id.payload_size : packet_count * codec_id.payload_size + codec_id.payload_size] + + send_data = self.generate_rtp_packet(audio_stream, codec_id, packet_count, sequence_number, timestamp) + rtpsocket.sendto(send_data, (rtp_ip, rtp_port) ) + + packet_count += 1 + sequence_number += 1 + timestamp += codec_id.sample_rate / (1000 / codec_id.sample_interval) + sleep(0.02) + + except Exception as e: + #Sudden Disconnect + _logger.error(e) + + try: + #Add the stream data to the call + voip_call_client = self.env['voip.call.client'].browse( int(voip_call_client_id) ) + voip_call_client.vc_id.write({'server_stream_data': base64.b64encode(server_stream_data)}) + except Exception as e: + _logger.error(e) + + #Have to manually commit the new cursor? + self.env.cr.commit() + + self._cr.close() + + def call_accepted(self, session, data): + _logger.error("Call Accepted") + + with api.Environment.manage(): + #As this function is in a new thread, i need to open a new cursor, because the old one may be closed + new_cr = self.pool.cursor() + self = self.with_env(self.env(cr=new_cr)) + + call_id = re.findall(r'Call-ID: (.*?)\r\n', data)[0] + call_to_full = re.findall(r'To: (.*?)\r\n', data)[0] + call_to = re.findall(r'', call_from_full)[0] + local_ip = self.env['ir.values'].get_default('voip.settings', 'server_ip') + + rtp_ip = re.findall(r'c=IN IP4 (.*?)\r\n', data)[0] + rtp_audio_port = int(re.findall(r'm=audio (.*?) RTP', data)[0]) + audio_stream = base64.decodestring(self.recorded_media_id.media) + + #Create the call now + voip_call = self.env['voip.call'].create({'from_address': call_from, 'to_address': session.username + "@" + session.domain, 'codec_id': self.recorded_media_id.codec_id.id, 'ring_time': datetime.datetime.now(), 'sip_call_id': call_id }) + + #Also create the client list + voip_call_client = self.env['voip.call.client'].create({'vc_id': voip_call.id, 'audio_media_port': rtp_audio_port, 'sip_address': call_from, 'name': call_from, 'model': False, 'record_id': False}) + + #Answer with a audio call + audio_media_port = random.randint(55000,56000) + call_sdp = sdp.generate_sdp(self, local_ip, audio_media_port, [0]) + session.answer_call(data, call_sdp) + + #The call was accepted so start listening for / sending RTP data + rtpsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + rtpsocket.bind(('', voip_call_client.audio_media_port)); + + rtc_sender_thread = threading.Thread(target=self.account_id.rtp_server_sender, args=(rtpsocket, rtp_ip, rtp_audio_port, audio_stream, voip_call.codec_id, voip_call_client.id,)) + rtc_sender_thread.start() + + rtc_listener_thread = threading.Thread(target=self.account_id.rtp_server_listener, args=(rtc_sender_thread, rtpsocket, voip_call_client.id, voip_call_client.model, voip_call_client.record_id,)) + rtc_listener_thread.start() + + def _voip_action_call_user(self, sipsocket, addr, data): + _logger.error("Call User") + +class VoipAccountActionType(models.Model): + + _name = "voip.account.action.type" + _description = "VOIP Account Action Type" + + name = fields.Char(string="Name") + internal_name = fields.Char(string="Internal Name", help="function name of code") \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_call.py b/voip_sip_webrtc/models/voip_call.py new file mode 100644 index 000000000..efc8b2c3a --- /dev/null +++ b/voip_sip_webrtc/models/voip_call.py @@ -0,0 +1,443 @@ +# -*- coding: utf-8 -*- +from openerp.http import request +import datetime +import logging +import socket +import threading +_logger = logging.getLogger(__name__) +import time +from random import randint +from hashlib import sha1 +import ssl +#from dtls import do_patch +#from dtls.sslconnection import SSLConnection +import hmac +import hashlib +import random +import string +import passlib +import struct +import zlib +import re +from openerp.exceptions import UserError +import binascii +from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT +from openerp import api, fields, models + +class VoipCall(models.Model): + + _name = "voip.call" + _order = 'create_date desc' + + from_address = fields.Char(string="From Address") + from_partner_id = fields.Many2one('res.partner', string="From Partner", help="From can be blank if the call comes from outside of the system") + from_partner_sdp = fields.Text(string="From Partner SDP") + partner_id = fields.Many2one('res.partner', string="(OBSOLETE)To Partner") + to_address = fields.Char(string="To Address") + to_partner_id = fields.Many2one('res.partner', string="To Partner", help="To partner can be blank if the source is external and no record with mobile or sip is found") + status = fields.Selection([('pending','Pending'), ('missed','Missed'), ('accepted','Accepted'), ('rejected','Rejected'), ('active','Active'), ('over','Complete'), ('failed','Failed'), ('busy','Busy'), ('cancelled','Cancelled')], string='Status', default="pending", help="Pending = Calling person\nActive = currently talking\nMissed = Call timed out\nOver = Someone hit end call\nRejected = Someone didn't want to answer the call") + ring_time = fields.Datetime(string="Ring Time", help="Time the call starts dialing") + start_time = fields.Datetime(string="Start Time", help="Time the call was answered (if answered)") + end_time = fields.Datetime(string="End Time", help="Time the call end") + duration = fields.Char(string="Duration", help="Length of the call") + transcription = fields.Text(string="Transcription", help="Automatic transcription of the call") + notes = fields.Text(string="(OBSOLETE)Notes", help="Additional comments outside the transcription (use the chatter instead of this field)") + client_ids = fields.One2many('voip.call.client', 'vc_id', string="Client List") + type = fields.Selection([('internal','Internal'),('external','External')], string="Type") + mode = fields.Selection([('videocall','video call'), ('audiocall','audio call'), ('screensharing','screen sharing call')], string="Mode", help="This is only how the call starts, i.e a video call can turn into a screen sharing call mid way") + sip_tag = fields.Char(string="SIP Tag") + voip_account = fields.Many2one('voip.account', string="VOIP Account") + to_audio = fields.Binary(string="Audio") + to_audio_filename = fields.Char(string="(OBSOLETE)Audio Filename") + media = fields.Binary(string="Media") + media_filename = fields.Char(string="Media Filename") + server_stream_data = fields.Binary(string="Server Stream Data", help="Stream data sent by the server, e.g. automated call") + media_url = fields.Char(string="Media URL", compute="_compute_media_url") + codec_id = fields.Many2one('voip.codec', string="Codec") + direction = fields.Selection([('internal','Internal'), ('incoming','Incoming'), ('outgoing','Outgoing')], string="Direction") + sip_call_id = fields.Char(string="SIP Call ID") + ice_username = fields.Char(string="ICE Username") + ice_password = fields.Char(string="ICE Password") + + @api.one + def _compute_media_url(self): + if self.media: + self.media_url = "/voip/messagebank/" + str(self.id) + else: + self.media_url = "" + + @api.model + def clear_messagebank(self): + """ Delete recorded phone call to clear up space """ + + for voip_call in self.env['voip.call'].search([('to_audio','!=', False)]): + #TODO remove to_audio + voip_call.to_audio = False + voip_call.to_audio_filename = False + + voip_call.server_stream_data = False + + voip_call.media = False + voip_call.media_filename = False + + #Also remove the media attached to the client + for voip_client in self.env['voip.call.client'].search([('audio_stream','!=', False)]): + voip_client.audio_stream = False + + def start_call(self): + """ Process the ICE queue now """ + + #Notify caller and callee that the call was rejected + for voip_client in self.client_ids: + notification = {'call_id': self.id} + self.env['bus.bus'].sendone((request._cr.dbname, 'voip.start', voip_client.partner_id.id), notification) + + def accept_call(self): + """ Mark the call as accepted and send response to close the notification window and open the VOIP window """ + + if self.status == "pending": + self.status = "accepted" + + #Notify caller and callee that the call was accepted + for voip_client in self.client_ids: + notification = {'call_id': self.id, 'status': 'accepted', 'type': self.type} + self.env['bus.bus'].sendone((request._cr.dbname, 'voip.response', voip_client.partner_id.id), notification) + + def reject_call(self): + """ Mark the call as rejected and send the response so the notification window is closed on both ends """ + + if self.status == "pending": + self.status = "rejected" + + #Notify caller and callee that the call was rejected + for voip_client in self.client_ids: + notification = {'call_id': self.id, 'status': 'rejected'} + self.env['bus.bus'].sendone((request._cr.dbname, 'voip.response', voip_client.partner_id.id), notification) + + def miss_call(self): + """ Mark the call as missed, both caller and callee will close there notification window due to the timeout """ + + if self.status == "pending": + self.status = "missed" + + def begin_call(self): + """ Mark the call as active, we start recording the call duration at this point """ + + if self.status == "accepted": + self.status = "active" + + self.start_time = datetime.datetime.now() + + def end_call(self): + """ Mark the call as over, we can calculate the call duration based on the start time, also send notification to both sides to close there VOIP windows """ + + if self.status == "active": + self.status = "over" + + self.end_time = datetime.datetime.now() + diff_time = datetime.datetime.strptime(self.end_time, DEFAULT_SERVER_DATETIME_FORMAT) - datetime.datetime.strptime(self.start_time, DEFAULT_SERVER_DATETIME_FORMAT) + self.duration = str(diff_time.seconds) + " Seconds" + + #Notify both caller and callee that the call is ended + for voip_client in self.client_ids: + notification = {'call_id': self.id} + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.end', voip_client.partner_id.id), notification) + + def voip_call_sdp(self, sdp): + """Store the description and send it to everyone else""" + + if self.type == "internal": + for voip_client in self.client_ids: + if voip_client.partner_id.id == self.env.user.partner_id.id: + voip_client.sdp = sdp + else: + notification = {'call_id': self.id, 'sdp': sdp } + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.sdp', voip_client.partner_id.id), notification) + + def generate_call_sdp(self): + + sdp_response = "" + + #Protocol Version ("v=") https://tools.ietf.org/html/rfc4566#section-5.1 (always 0 for us) + sdp_response += "v=0\r\n" + + #Origin ("o=") https://tools.ietf.org/html/rfc4566#section-5.2 (Should come up with a better session id...) + sess_id = int(time.time()) #Not perfect but I don't expect more then one call a second + sess_version = 0 #Will always start at 0 + sdp_response += "o=- " + str(sess_id) + " " + str(sess_version) + " IN IP4 0.0.0.0\r\n" + + #Session Name ("s=") https://tools.ietf.org/html/rfc4566#section-5.3 (We don't need a session name, information about the call is all displayed in the UI) + sdp_response += "s= \r\n" + + #Timing ("t=") https://tools.ietf.org/html/rfc4566#section-5.9 (For now sessions are infinite but we may use this if for example a company charges a price for a fixed 30 minute consultation) + sdp_response += "t=0 0\r\n" + + #In later versions we might send the missed call mp3 via rtp + sdp_response += "a=sendrecv\r\n" + + #TODO generate cert/fingerprint within module + fignerprint = self.env['ir.default'].get('voip.settings', 'fingerprint') + sdp_response += "a=fingerprint:sha-256 " + fignerprint + "\r\n" + sdp_response += "a=setup:passive\r\n" + + #Sure why not + sdp_response += "a=ice-options:trickle\r\n" + + #Sigh no idea + sdp_response += "a=msid-semantic:WMS *\r\n" + + #Random stuff, left here so I don't have get it a second time if needed + #example supported audio profiles: 109 9 0 8 101 + #sdp_response += "m=audio 9 UDP/TLS/RTP/SAVPF 109 101\r\n" + + #Media Descriptions ("m=") https://tools.ietf.org/html/rfc4566#section-5.14 (Message bank is audio only for now) + audio_codec = "9" #Use G722 Audio Profile + sdp_response += "m=audio 9 UDP/TLS/RTP/SAVPF " + audio_codec + "\r\n" + + #Connection Data ("c=") https://tools.ietf.org/html/rfc4566#section-5.7 (always seems to be 0.0.0.0?) + sdp_response += "c=IN IP4 0.0.0.0\r\n" + + #ICE creds (https://tools.ietf.org/html/rfc5245#page-76) + ice_ufrag = ''.join(random.choice('123456789abcdef') for _ in range(4)) + ice_pwd = ''.join(random.choice('123456789abcdef') for _ in range(22)) + self.ice_password = ice_pwd + sdp_response += "a=ice-ufrag:" + str(ice_ufrag) + "\r\n" + sdp_response += "a=ice-pwd:" + str(ice_pwd) + "\r\n" + + #Ummm naming each media?!? + sdp_response += "a=mid:sdparta_0\r\n" + + return {"type":"answer","sdp": sdp_response} + + def message_bank(self, sdp): + + _logger.error("Message Bank") + + #Ideally an integrity check should be done to ensure binding requests are valid, this is particiularly an issue for http since the random port can be sniffed. + #result = re.search('\r\na=ice-pwd:(.*)\r\n', sdp['sdp']) + #ice_password = result.group(1) + + server_sdp = self.generate_call_sdp() + + + + notification = {'call_id': self.id, 'sdp': server_sdp } + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.sdp', self.from_partner_id.id), notification) + + #RTP + #port = 62382 + #Random even number + port = randint(16384 /2, 32767 / 2) * 2 + server_ice_candidate = self.env['voip.server'].generate_server_ice(port, 1) + self.start_rtc_listener(port, "RTP") + notification = {'call_id': self.id, 'ice': server_ice_candidate } + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.ice', self.from_partner_id.id), notification) + + #RTCP + port += 1 + server_ice_candidate = self.env['voip.server'].generate_server_ice(port, 2) + self.start_rtc_listener(port, "RTCP") + notification = {'call_id': self.id, 'ice': server_ice_candidate } + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.ice', self.from_partner_id.id), notification) + + def voip_call_ice(self, ice): + """Forward ICE to everyone else""" + + for voip_client in self.client_ids: + + #Don't send ICE back to yourself + if voip_client.partner_id.id != self.env.user.partner_id.id: + notification = {'call_id': self.id, 'ice': ice } + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.ice', voip_client.partner_id.id), notification) + + def close_message_bank(self): + + #Notify the caller that the call is ended due to message bank timeout + notification = {'call_id': self.id} + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.end', self.from_partner_id.id), notification) + + #TODO trancode G722 to a format that can be listened to within a browser + + #TODO save the transcoded file to the call so it can be listened to later (Only keep for 48 hours to save space also legal requirements in some places) + + def webrtc_dtls_handshake(self): + #Stage 2 DTLS + _logger.error("DTLS INCOMPLETE") + + def rtp_stun_listener(self, d, client_ip, port): + + if d[1] == "00" and d[2] == "01": + message_type = "Binding Request" + + message_length = int( d[3] + d[4], 16) + message_cookie = ' '.join(d[5:9]) + transaction_id = ' '.join(d[9:21]) + + #----Compose binding request----- + send_data = "" + + #Message Type (Binding Success Response) + send_data += "01 01" + + #Message Length (In this controlled environment it will always be 44) + send_data += " 00 2C" + + #Magic Cookie (always set to 0x2112A442) + send_data += " 21 12 a4 42" + + #96 bit (12 byte) transaction ID (has to be the same as the bind request) + send_data += transaction_id + + #XOR mapped address attribute + send_data += " 00 20" + + #Attribute Length (fixed 8 for IPv4, IPv6 will increase this) + send_data += " 00 08" + + #Reservered (reserved for what...) + send_data += " 00" + + #Protocol Family (Always IPv4 for now...) + send_data += " 01" + + #Port XOR + client_port = port + send_data += " " + format( client_port ^ 0x2112 , '04x') + + #IP XOR-d + client_ip_int = struct.unpack("!I", socket.inet_aton(client_ip))[0] + send_data += " " + format( client_ip_int ^ 0x2112A442 , '08x') + + #Cut off header + hmac_input = send_data.replace(" ","")[8:] + + #Readd header but subtract 8 from length before calculating hmac + hmac_input = "01010024" + hmac_input + + stun_password = self.ice_password + + key = passlib.utils.saslprep( stun_password ) + + mess_hmac = hmac.new( str(key), msg=hmac_input.decode("hex"), digestmod=hashlib.sha1).digest().encode('hex') + + #Message Integrity Attribute + send_data += " 00 08" + + #Attribute Length (Always 20 bytes) + send_data += " 00 14" + + #HMAC-SHA1 + send_data += mess_hmac + + + crc32_int = binascii.crc32( binascii.a2b_hex( send_data.replace(" ","") ) ) % (1<<32) + crc_hex = format( crc32_int ^ 0x5354554e, '08x') + + #Fingerprint Attribute + send_data += " 80 28" + + #Atrribute Length (CRC-32 is always 4 bytes) + send_data += " 00 04" + + #Fingerprint + send_data += " " + crc_hex + + #Ok now convert it back so we can send it + return send_data.replace(" ","").decode('hex') + + def rtp_server_listener(self, port, message_bank_duration): + + + #First Message we get is the conectivity test (STUN Binding Request User) + + #Second is DTLSv1.2 or more specifically dtls-strp + + #3rd is the stream with the G722 Audio payload + + _logger.error("Start RTP Listening on Port " + str(port) ) + + + stunsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + stunsocket.bind(('', port)); + + start = time.time() + stage = "STUN" + hex_string = "" + + + #Code is easier to understand if we start at 1 rather then 0... + hex_data = ['FF'] + + #Stage 1 STUN Connectivity Test + while stage == "STUN" or stage == "DTLS HELLO": + + data, addr = stunsocket.recvfrom(2048) + + #Convert to hex so we can human interpret each byte + for rtp_char in data: + hex_format = "{0:02x}".format(ord(rtp_char)) + hex_data.append(hex_format) + hex_string += hex_format + " " + + _logger.error("HEX DATA: " + hex_string) + + if stage == "STUN": + send_data = self.rtp_stun_listener(hex_data, addr[0], port) + stunsocket.sendto(send_data, addr ) + #We don't get any acknowledgement so we just assume everything went fine... + stage = "DTLS HELLO" + else: + send_data = self.webrtc_dtls_handshake() + stunsocket.sendto(send_data, addr ) + stage = "DTLS CIPHER" + + _logger.error("DTLS Stage") + + #Stage 2 DTLS (TODO) + + #End the call and do any post call processing + with api.Environment.manage(): + # As this function is in a new thread, i need to open a new cursor, because the old one may be closed + new_cr = self.pool.cursor() + self = self.with_env(self.env(cr=new_cr)) + + self.close_message_bank() + + #Have to manually commit the new cursor? + self.env.cr.commit() + + self._cr.close() + + _logger.error("END MESSAGE BANK") + + def start_rtc_listener(self, port, mode): + + message_bank_duration = self.env['ir.default'].get('voip.settings', 'message_bank_duration') + + #Start a new thread so you don't block the main Odoo thread + if mode is "RTP": + rtc_listener_starter = threading.Thread(target=self.rtp_server_listener, args=(port,message_bank_duration,)) + rtc_listener_starter.start() + elif mode is "RTCP": + #For now we don't use RTCP... + rtc_listener_starter = threading.Thread(target=self.rtp_server_listener, args=(port,message_bank_duration,)) + rtc_listener_starter.start() + +class VoipCallClient(models.Model): + + _name = "voip.call.client" + + vc_id = fields.Many2one('voip.call', string="VOIP Call") + partner_id = fields.Many2one('res.partner', string="Partner") + sip_address = fields.Char(string="SIP Address") + name = fields.Char(string="Name", help="Can be a number if the client is from outside the system") + model = fields.Char(string="Model") + record_id = fields.Integer(string="Record ID") + state = fields.Selection([('invited','Invited'),('joined','joined'),('media_access','Media Access')], string="State", default="invited") + sdp = fields.Char(string="SDP") + sip_invite = fields.Char(string="SIP INVITE Message") + sip_addr = fields.Char(string="Address") + sip_addr_host = fields.Char(string="SIP Address Host") + sip_addr_port = fields.Char(string="SIP Address Port") + audio_media_port = fields.Integer(string="Audio Media Port") + audio_stream = fields.Binary(string="Audio Stream") \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_call_template.py b/voip_sip_webrtc/models/voip_call_template.py new file mode 100644 index 000000000..a3d661c72 --- /dev/null +++ b/voip_sip_webrtc/models/voip_call_template.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +import logging +_logger = logging.getLogger(__name__) +import functools +from werkzeug import urls +from datetime import datetime +import base64 + +from openerp import api, fields, models, tools + +try: + # We use a jinja2 sandboxed environment to render mako templates. + # Note that the rendering does not cover all the mako syntax, in particular + # arbitrary Python statements are not accepted, and not all expressions are + # allowed: only "public" attributes (not starting with '_') of objects may + # be accessed. + # This is done on purpose: it prevents incidental or malicious execution of + # Python code that may break the security of the server. + from jinja2.sandbox import SandboxedEnvironment + mako_template_env = SandboxedEnvironment( + block_start_string="<%", + block_end_string="%>", + variable_start_string="${", + variable_end_string="}", + comment_start_string="<%doc>", + comment_end_string="", + line_statement_prefix="%", + line_comment_prefix="##", + trim_blocks=True, # do not output newline after blocks + autoescape=True, # XML/HTML automatic escaping + ) + mako_template_env.globals.update({ + 'str': str, + 'quote': urls.url_quote, + 'urlencode': urls.url_encode, + 'datetime': datetime, + 'len': len, + 'abs': abs, + 'min': min, + 'max': max, + 'sum': sum, + 'filter': filter, + 'reduce': functools.reduce, + 'map': map, + 'round': round, + + # dateutil.relativedelta is an old-style class and cannot be directly + # instanciated wihtin a jinja2 expression, so a lambda "proxy" is + # is needed, apparently. + 'relativedelta': lambda *a, **kw : relativedelta.relativedelta(*a, **kw), + }) +except ImportError: + _logger.warning("jinja2 not available, templating features will not work!") + +class VoipCallTemplate(models.Model): + + _name = "voip.call.template" + + name = fields.Char(string="Name") + model_id = fields.Many2one('ir.model', string="Applies to", help="The kind of document with with this template can be used") + voip_account_id = fields.Many2one('voip.account', string="VOIP Account") + to_address = fields.Char(string="To Address", help="Use placeholders") + media_id = fields.Many2one('voip.media', string="Media") + codec_id = fields.Many2one('voip.codec', string="Codec") + type = fields.Selection([('prerecorded','Pre Recorded')], string="Template Type", default="prerecorded") + model_object_field_id = fields.Many2one('ir.model.fields', string="Field", help="Select target field from the related document model.\nIf it is a relationship field you will be able to select a target field at the destination of the relationship.") + sub_object_id = fields.Many2one('ir.model', string='Sub-model', readonly=True, help="When a relationship field is selected as first field, this field shows the document model the relationship goes to.") + sub_model_object_field_id = fields.Many2one('ir.model.fields', string='Sub-field', help="When a relationship field is selected as first field, this field lets you select the target field within the destination document model (sub-model).") + null_value = fields.Char(string='Default Value', help="Optional value to use if the target field is empty") + copyvalue = fields.Char(string='Placeholder Expression', help="Final placeholder expression, to be copy-pasted in the desired template field.") + + @api.onchange('model_object_field_id') + def _onchange_model_object_field_id(self): + if self.model_object_field_id.relation: + self.sub_object_id = self.env['ir.model'].search([('model','=',self.model_object_field_id.relation)])[0].id + else: + self.sub_object_id = False + + if self.model_object_field_id: + self.copyvalue = self.build_expression(self.model_object_field_id.name, self.sub_model_object_field_id.name, self.null_value) + + @api.onchange('sub_model_object_field_id') + def _onchange_sub_model_object_field_id(self): + if self.sub_model_object_field_id: + self.copyvalue = self.build_expression(self.model_object_field_id.name, self.sub_model_object_field_id.name, self.null_value) + + @api.model + def build_expression(self, field_name, sub_field_name, null_value): + """Returns a placeholder expression for use in a template field, + based on the values provided in the placeholder assistant. + + :param field_name: main field name + :param sub_field_name: sub field name (M2O) + :param null_value: default value if the target value is empty + :return: final placeholder expression + """ + expression = '' + if field_name: + expression = "${object." + field_name + if sub_field_name: + expression += "." + sub_field_name + if null_value: + expression += " or '''%s'''" % null_value + expression += "}" + return expression + + def make_call(self, record_id): + _logger.error("Make Call") + if self.type == "prerecorded" or self.type == False: + to_address = self.render_template( self.to_address, self.model_id.model, record_id) + + if self.media: + #BACK COMPATABILITY TODO remove in version 11 + decoded_media = base64.decodestring(self.media) + self.voip_account_id.make_call(to_address, decoded_media, self.codec_id, self.model_id.model, record_id) + else: + decoded_media = base64.decodestring(self.media_id.media) + self.voip_account_id.make_call(to_address, decoded_media, self.media_id.codec_id, self.model_id.model, record_id) + elif self.type == "synth": + rendered_text = self.render_template( self.synth_text, self.model_id.model, record_id) + to_address = self.render_template( self.to_address, self.model_id.model, record_id) + audio_stream = self.voice_synth_id.voice_synth(rendered_text, self.codec_id) + self.voip_account_id.make_call(to_address, audio_stream, self.codec_id, self.model_id.model, record_id) + + def render_template(self, template_txt, model, res_id): + """Render the given template text, replace mako expressions ``${expr}`` + with the result of evaluating these expressions with + an evaluation context containing: + + * ``user``: browse_record of the current user + * ``object``: browse_record of the document record this mail is + related to + * ``context``: the context passed to the mail composition wizard + + :param str template: the template text to render + :param str model: model name of the document record this mail is related to. + :param int res_id: id of document records those mails are related to. + """ + + # try to load the template + try: + mako_env = mako_safe_template_env if self.env.context.get('safe') else mako_template_env + template = mako_template_env.from_string(tools.ustr(template_txt)) + except Exception: + _logger.error("Failed to load template %r", template) + return False + + # prepare template variables + user = self.env.user + record = self.env[model].browse( int(res_id) ) + + variables = { + 'user': user + } + + variables['object'] = record + + try: + render_result = template.render(variables) + except Exception as e: + _logger.error("Failed to render template %r using values %r" % (template, variables)) + _logger.error(e) + render_result = u"" + if render_result == u"False": + render_result = u"" + + return render_result \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_call_template_preview.py b/voip_sip_webrtc/models/voip_call_template_preview.py new file mode 100644 index 000000000..86c8e1b97 --- /dev/null +++ b/voip_sip_webrtc/models/voip_call_template_preview.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +import logging +_logger = logging.getLogger(__name__) + +from openerp import api, fields, models, tools + +class VoipCallTemplatePreview(models.TransientModel): + + _name = "voip.call.template.preview" + + @api.model + def _get_records(self): + """ Returns the first 10 records of the VOIP call template's model """ + + #Get call template through context since we can't get it through self + call_template = self.env['voip.call.template'].browse( self._context.get('default_call_template_id') ) + + if call_template: + records = self.env[call_template.model_id.model].search([], limit=10) + return records.name_get() + else: + return [] + + call_template_id = fields.Many2one('voip.call.template', string="Call Template") + rec_id = fields.Selection(_get_records, string="Record") + + def test_call_template(self): + self.call_template_id.make_call(self.rec_id) \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_codec.py b/voip_sip_webrtc/models/voip_codec.py new file mode 100644 index 000000000..d5f81c44e --- /dev/null +++ b/voip_sip_webrtc/models/voip_codec.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from openerp import api, fields, models + +class VoipCodec(models.Model): + + _name = "voip.codec" + + name = fields.Char(string="Name") + payload_type = fields.Integer(string="Payload Type") + encoding = fields.Char(string="Encoding") + sample_rate = fields.Integer(string="Sample Rate") + payload_size = fields.Integer(string="Payload Size") + sample_interval = fields.Integer(string="Sample Interval") + supported = fields.Boolean(string="Supported") + sdp_data = fields.Char(string="SDP Data") + riff_audio_encoding_value = fields.Integer("RIFF Audio Encoding Value") \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_media.py b/voip_sip_webrtc/models/voip_media.py new file mode 100644 index 000000000..3afe004f9 --- /dev/null +++ b/voip_sip_webrtc/models/voip_media.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +from openerp import api, fields, models + +class VoipMedia(models.Model): + + _name = "voip.media" + + name = fields.Char(string="Name") + media = fields.Binary(string="Media File") + media_filename = fields.Char(string="Media Filename") + codec_id = fields.Many2one('voip.codec', string="Codec") \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_message_compose.py b/voip_sip_webrtc/models/voip_message_compose.py new file mode 100644 index 000000000..d7a94d930 --- /dev/null +++ b/voip_sip_webrtc/models/voip_message_compose.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +import socket +import threading +import logging +_logger = logging.getLogger(__name__) +from lxml import etree +import re +from odoo.exceptions import UserError + +from openerp import api, fields, models + +class VoipMessageCompose(models.TransientModel): + + _name = "voip.message.compose" + + type = fields.Char(string="Message Type") + sip_account_id = fields.Many2one('voip.account', string="SIP Account") + message_template_id = fields.Many2one('voip.message.template', string="Message Template") + partner_id = fields.Many2one('res.partner', string="Partner (OBSOLETE)") + model = fields.Char(string="Model") + record_id = fields.Integer(string="Record ID") + to_address = fields.Char(string="To Address") + message = fields.Text(string="Message") + + @api.onchange('message_template_id') + def _onchange_message_template_id(self): + self.message = self.message_template_id.message + + def send_message(self): + + method = '_send_%s_message' % (self.type,) + action = getattr(self, method, None) + + if not action: + raise NotImplementedError('Method %r is not implemented on %r object.' % (method, self)) + + action() + + def _send_sip_message(self): + + message_response = self.sip_account_id.send_message(self.to_address, self.message, model=self.model, record_id=self.record_id) + + if message_response != "OK": + _logger.error("SIP Message Failure") + raise UserError("Failed to send SIP message: " + message_response) \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_message_template.py b/voip_sip_webrtc/models/voip_message_template.py new file mode 100644 index 000000000..d2c47b485 --- /dev/null +++ b/voip_sip_webrtc/models/voip_message_template.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +import logging +_logger = logging.getLogger(__name__) + +from openerp import api, fields, models + +class VoipMessageTemplate(models.Model): + + _name = "voip.message.template" + + name = fields.Char(string="Name") + message = fields.Text(string="Message") \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_ringtone.py b/voip_sip_webrtc/models/voip_ringtone.py new file mode 100644 index 000000000..c2828f97a --- /dev/null +++ b/voip_sip_webrtc/models/voip_ringtone.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +from openerp.http import request + +from openerp import api, fields, models + +class VoipRingtone(models.Model): + + _name = "voip.ringtone" + + name = fields.Char(string="Name") + media = fields.Binary(string="Media File") + media_filename = fields.Char(string="Media Filename") \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_server.py b/voip_sip_webrtc/models/voip_server.py new file mode 100644 index 000000000..6b8705c78 --- /dev/null +++ b/voip_sip_webrtc/models/voip_server.py @@ -0,0 +1,329 @@ +# -*- coding: utf-8 -*- +from openerp.http import request +import socket +import threading +import logging +_logger = logging.getLogger(__name__) +import json +import random +from random import randint +import time +import string +import socket +import datetime +import re + +from odoo import api, fields, models, registry +from odoo.exceptions import UserError, ValidationError + +class VoipVoip(models.Model): + + _name = "voip.server" + _description = "Voip Server" + + @api.model + def get_user_agent(self, **kw): + """ Get SIP adress, auth username and password """ + + voip_account = self.env.user.voip_account_id + + if voip_account: + return {'address': voip_account.address, 'wss': voip_account.wss, 'auth_username': voip_account.auth_username, 'password': voip_account.password} + else: + return {'address': ''} + + @api.model + def user_list(self, **kw): + """ Get all active users so we can place them in the system tray """ + + user_list = [] + + #This list should only include users that have ever logged in, sort it by last presence that way all the online users are at the top + for presence_user in self.env['bus.presence'].search([('user_id','!=',self.env.user.id)], order="last_presence desc"): + + #We kinda just assume if a person hasn't been active for 5 minutes they are AFK, this isn't reliable but is better then nothing + if presence_user.last_presence > (datetime.datetime.now() - datetime.timedelta(minutes=5) ).strftime("%Y-%m-%d %H:%M:%S"): + status = "Online" + else: + status = "Offline" + + user_list.append({'name': presence_user.user_id.name, 'partner_id':presence_user.user_id.partner_id.id, 'status': status}) + + return user_list + + @api.model + def sip_call_notify(self, mode, call_type, aor): + """ Create the VOIP call record and notify the callee of the incoming call """ + + #Create the VOIP call now so we can mark it as missed / rejected / accepted + voip_call = self.env['voip.call'].create({'type': call_type, 'mode': mode }) + + #Find the caller based on the address of record + from_partner = self.env['res.partner'].search([('sip_address','=', aor)]) + + if from_partner == False: + raise UserError("Could not find SIP partner") + + #Add the current user is the call owner + voip_call.from_partner_id = from_partner.id + + #Add the current user as the to partner + voip_call.partner_id = self.env.user.partner_id.id + + #Also add both partners to the client list + self.env['voip.call.client'].sudo().create({'vc_id':voip_call.id, 'partner_id': from_partner.id, 'state':'joined', 'name': from_partner.name}) + self.env['voip.call.client'].sudo().create({'vc_id':voip_call.id, 'partner_id': self.env.user.partner_id.id, 'state':'invited', 'name': self.env.user.partner_id.name}) + + #Ringtone will either the default ringtone or the users ringtone + ringtone = "/voip/ringtone/" + str(voip_call.id) + ".mp3" + ring_duration = self.env['ir.default'].get('voip.settings', 'ring_duration') + + #Complicated code just to get the display name of the mode... + mode_display = dict(self.env['voip.call'].fields_get(allfields=['mode'])['mode']['selection'])[voip_call.mode] + + #Send notification to callee + notification = {'voip_call_id': voip_call.id, 'ringtone': ringtone, 'ring_duration': ring_duration, 'from_name': from_partner.name, 'caller_partner_id': from_partner.id, 'direction': 'incoming', 'mode':mode, 'sdp': ''} + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.notification', self.env.user.partner_id.id), notification) + + @api.model + def voip_call_notify(self, mode, to_partner_id, call_type, sdp): + """ Create the VOIP call record and notify the callee of the incoming call """ + + #Create the VOIP call now so we can mark it as missed / rejected / accepted + voip_call = self.env['voip.call'].create({'type': call_type, 'mode': mode }) + + #Add the current user is the call owner + voip_call.from_partner_id = self.env.user.partner_id.id + + #Add the selected user as the to partner + voip_call.partner_id = int(to_partner_id) + + #Also add both partners to the client list + self.env['voip.call.client'].sudo().create({'vc_id':voip_call.id, 'partner_id': self.env.user.partner_id.id, 'state':'joined', 'name': self.env.user.partner_id.name}) + self.env['voip.call.client'].sudo().create({'vc_id':voip_call.id, 'partner_id': voip_call.partner_id.id, 'state':'invited', 'name': voip_call.partner_id.name}) + + #Ringtone will either the default ringtone or the users ringtone + ringtone = "/voip/ringtone/" + str(voip_call.id) + ".mp3" + ring_duration = self.env['ir.default'].get('voip.settings', 'ring_duration') + + #Complicated code just to get the display name of the mode... + mode_display = dict(self.env['voip.call'].fields_get(allfields=['mode'])['mode']['selection'])[voip_call.mode] + + if voip_call.type == "internal": + #Send notification to callee + notification = {'voip_call_id': voip_call.id, 'ringtone': ringtone, 'ring_duration': ring_duration, 'from_name': self.env.user.partner_id.name, 'caller_partner_id': self.env.user.partner_id.id, 'direction': 'incoming', 'mode':mode, 'sdp': sdp} + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.notification', voip_call.partner_id.id), notification) + + #Also send one to yourself so we get the countdown + notification = {'voip_call_id': voip_call.id, 'ring_duration': ring_duration, 'to_name': voip_call.partner_id.name, 'callee_partner_id': voip_call.partner_id.id, 'direction': 'outgoing'} + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.notification', voip_call.from_partner_id.id), notification) + + elif voip_call.type == "external": + _logger.error("external call") + + #Send the INVITE + voip_account = self.env.user.voip_account_id + voip_call.voip_account = voip_account + voip_call.from_partner_sdp = sdp['sdp'] + media_port = random.randint(55000,56000) + call_id = random.randint(50000,60000) + from_tag = random.randint(8000000,9000000) + + sipsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sipsocket.bind(('', 6000)) + bind_port = sipsocket.getsockname()[1] + + local_ip = self.env['ir.default'].get('voip.settings', 'server_ip') + + #SDP from webrtc doesn't work?!? + sdp = sdp['sdp'] + + + #Server SDP (Works) + sdp = "" + sdp += "v=0\r\n" + sess_id = int(time.time()) + sess_version = 0 + sdp += "o=- " + str(sess_id) + " " + str(sess_version) + " IN IP4 " + local_ip + "\r\n" + sdp += "s= \r\n" + sdp += "c=IN IP4 " + local_ip + "\r\n" + sdp += "t=0 0\r\n" + sdp += "m=audio " + str(media_port) + " RTP/AVP 0\r\n" + sdp += "a=sendrecv\r\n" + + #Webrtc SDP Data (Fails) + sdp = "" + sdp += "v=0\r\n" + sdp += "o=mozilla...THIS_IS_SDPARTA-57.0 9175984511205677962 0 IN IP4 0.0.0.0\r\n" + sdp += "s=-\r\n" + sdp += "t=0 0\r\n" + sdp += "a=fingerprint:sha-256 3B:D9:87:A6:7F:E2:B3:F8:0D:92:9F:B7:4A:D7:84:17:E9:C9:5E:70:64:06:85:21:B9:7C:6D:5D:3D:78:36:6B\r\n" + sdp += "a=group:BUNDLE sdparta_0\r\n" + sdp += "a=ice-options:trickle\r\n" + sdp += "a=msid-semantic:WMS *\r\n" + sdp += "m=audio 9 UDP/TLS/RTP/SAVPF 109 9 0 8 101\r\n" + sdp += "c=IN IP4 0.0.0.0\r\n" + sdp += "a=sendrecv\r\n" + sdp += "a=extmap:1/sendonly urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n" + sdp += "a=fmtp:109 maxplaybackrate=48000;stereo=1;useinbandfec=1\r\n" + sdp += "a=fmtp:101 0-15\r\n" + sdp += "a=ice-pwd:66f0aeeb56dd05307985a8715f7badcd\r\n" + sdp += "a=ice-ufrag:afa2841a\r\n" + sdp += "a=mid:sdparta_0\r\n" + sdp += "a=msid:{83486b07-4708-46d3-92c7-909f5a598edc} {d04078f0-2166-4d12-b657-c7ca1bb5041b}\r\n" + sdp += "a=rtcp-mux\r\n" + sdp += "a=rtpmap:109 opus/48000/2\r\n" + sdp += "a=rtpmap:9 G722/8000/1\r\n" + sdp += "a=rtpmap:0 PCMU/8000\r\n" + sdp += "a=rtpmap:8 PCMA/8000\r\n" + sdp += "a=rtpmap:101 telephone-event/8000/1\r\n" + sdp += "a=setup:actpass\r\n" + sdp += "a=ssrc:645231268 cname:{b132b6ce-4687-4a65-9796-f82caca3ab92}\r\n" + + to_address = voip_call.partner_id.mobile.strip() + + if "@" not in to_address: + to_address = to_address + "@" + voip_account.domain + + invite_string = "" + invite_string += "INVITE sip:" + to_address + ":" + str(voip_account.port) + " SIP/2.0\r\n" + invite_string += "Via: SIP/2.0/UDP " + local_ip + ":" + str(bind_port) + ";branch=z9hG4bK-524287-1---0d0dce78a0c26252;rport\r\n" + invite_string += "Max-Forwards: 70\r\n" + invite_string += "Contact: \r\n" + invite_string += 'To: \r\n" + invite_string += 'From: "' + voip_account.voip_display_name + '";tag=" + str(from_tag) + "\r\n" + invite_string += "Call-ID: " + request.env.cr.dbname + "-call-" + str(call_id) + "\r\n" + invite_string += "CSeq: 1 INVITE\r\n" + invite_string += "Allow: SUBSCRIBE, NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO, OPTIONS, MESSAGE\r\n" + invite_string += "Content-Type: application/sdp\r\n" + invite_string += "Supported: replaces\r\n" + invite_string += "User-Agent: Sythil Tech SIP Client\r\n" + invite_string += "Content-Length: " + str( len(sdp) ) + "\r\n" + invite_string += "\r\n" + invite_string += sdp + + _logger.error(invite_string ) + + if voip_account.outbound_proxy: + sipsocket.sendto(invite_string, (voip_account.outbound_proxy, voip_account.port) ) + else: + sipsocket.sendto(invite_string, (voip_account.domain, voip_account.port) ) + + stage = "WAITING" + while stage == "WAITING": + sipsocket.settimeout(10) + data, addr = sipsocket.recvfrom(2048) + + _logger.error(data) + + #Send auth response if challenged + if data.split("\r\n")[0] == "SIP/2.0 407 Proxy Authentication Required" or data.split("\r\n")[0] == "SIP/2.0 407 Proxy Authentication required": + + authheader = re.findall(r'Proxy-Authenticate: (.*?)\r\n', data)[0] + + realm = re.findall(r'realm="(.*?)"', authheader)[0] + method = "INVITE" + uri = "sip:" + to_address + nonce = re.findall(r'nonce="(.*?)"', authheader)[0] + qop = re.findall(r'qop="(.*?)"', authheader)[0] + nc = "00000001" + cnonce = ''.join([random.choice('0123456789abcdef') for x in range(32)]) + + #For now we assume qop is present (https://tools.ietf.org/html/rfc2617#section-3.2.2.1) + A1 = voip_account.username + ":" + realm + ":" + voip_account.password + A2 = method + ":" + uri + response = voip_account.KD( voip_account.H(A1), nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + voip_account.H(A2) ) + + reply = "" + reply += "INVITE sip:" + to_address + ":" + str(voip_account.port) + " SIP/2.0\r\n" + reply += "Via: SIP/2.0/UDP " + local_ip + ":" + str(bind_port) + ";branch=z9hG4bK-524287-1---0d0dce78a0c26252;rport\r\n" + reply += "Max-Forwards: 70\r\n" + reply += "Contact: \r\n" + reply += 'To: \r\n" + reply += 'From: "' + voip_account.voip_display_name + '";tag=" + str(from_tag) + "\r\n" + reply += "Call-ID: " + request.env.cr.dbname + "-call-" + str(call_id) + "\r\n" + reply += "CSeq: 1 INVITE\r\n" + reply += "Allow: SUBSCRIBE, NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO, OPTIONS, MESSAGE\r\n" + reply += "Content-Type: application/sdp\r\n" + reply += 'Proxy-Authorization: Digest username="' + voip_account.username + '",realm="' + realm + '",nonce="' + nonce + '",uri="sip:' + to_address + '",response="' + response + '",cnonce="' + cnonce + '",nc=' + nc + ',qop=auth,algorithm=MD5' + "\r\n" + reply += "Supported: replaces\r\n" + reply += "User-Agent: Sythil Tech SIP Client\r\n" + reply += "Content-Length: " + str( len(sdp) ) + "\r\n" + reply += "\r\n" + reply += sdp + + sipsocket.sendto(reply, addr) + + @api.model + def generate_server_ice(self, port, component_id): + + ice_response = "" + + #ip_addr = socket.gethostbyname(host) + ip = self.env['ir.default'].get('voip.settings', 'server_ip') + + #See https://tools.ietf.org/html/rfc5245#section-4.1.2.1 (I don't make up these formulas...) + priority = int((2 ^ 24) * 126) + int((2 ^ 8) * 65535) + + #For now we assume the server on has one public facing network card... + foundation = "0" + + ice_response = "candidate:" + foundation + " " + str(component_id) + " UDP " + str(priority) + " " + str(ip) + " " + str(port) + " typ host" + + return {"candidate":ice_response,"sdpMid":"sdparta_0","sdpMLineIndex":0} + + @api.model + def generate_server_sdp(self): + + sdp_response = "" + + #Protocol Version ("v=") https://tools.ietf.org/html/rfc4566#section-5.1 (always 0 for us) + sdp_response += "v=0\r\n" + + #Origin ("o=") https://tools.ietf.org/html/rfc4566#section-5.2 (Should come up with a better session id...) + sess_id = int(time.time()) #Not perfect but I don't expect more then one call a second + sess_version = 0 #Will always start at 0 + sdp_response += "o=- " + str(sess_id) + " " + str(sess_version) + " IN IP4 0.0.0.0\r\n" + + #Session Name ("s=") https://tools.ietf.org/html/rfc4566#section-5.3 (We don't need a session name, information about the call is all displayed in the UI) + sdp_response += "s= \r\n" + + #Timing ("t=") https://tools.ietf.org/html/rfc4566#section-5.9 (For now sessions are infinite but we may use this if for example a company charges a price for a fixed 30 minute consultation) + sdp_response += "t=0 0\r\n" + + #In later versions we might send the missed call mp3 via rtp + sdp_response += "a=sendrecv\r\n" + + #TODO generate before call fingerprint... + sdp_response += "a=fingerprint:sha-256 DA:52:67:C5:2A:2E:91:13:A2:7D:3A:E1:2E:A4:F3:28:90:67:71:0E:B7:6F:7B:56:79:F4:B2:D1:54:4B:92:7E\r\n" + #sdp_response += "a=setup:actpass\r\n" + sdp_response += "a=setup:passive\r\n" + #sdp_response += "a=setup:active\r\n" + + #Sure why not + sdp_response += "a=ice-options:trickle\r\n" + + #Sigh no idea + sdp_response += "a=msid-semantic:WMS *\r\n" + + #Random stuff, left here so I don't have get it a second time if needed + #example supported audio profiles: 109 9 0 8 101 + #sdp_response += "m=audio 9 UDP/TLS/RTP/SAVPF 109 101\r\n" + + #Media Descriptions ("m=") https://tools.ietf.org/html/rfc4566#section-5.14 (Message bank is audio only for now) + audio_codec = "9" #Use G722 Audio Profile + sdp_response += "m=audio 9 UDP/TLS/RTP/SAVPF " + audio_codec + "\r\n" + + #Connection Data ("c=") https://tools.ietf.org/html/rfc4566#section-5.7 (always seems to be 0.0.0.0?) + sdp_response += "c=IN IP4 0.0.0.0\r\n" + + #ICE creds (https://tools.ietf.org/html/rfc5245#page-76) + ice_ufrag = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(4)) + ice_pwd = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(22)) + sdp_response += "a=ice-ufrag:" + str(ice_ufrag) + "\r\n" + sdp_response += "a=ice-pwd:" + str(ice_pwd) + "\r\n" + + #Ummm naming each media?!? + sdp_response += "a=mid:sdparta_0\r\n" + + return {"type":"answer","sdp": sdp_response} \ No newline at end of file diff --git a/voip_sip_webrtc/models/voip_settings.py b/voip_sip_webrtc/models/voip_settings.py new file mode 100644 index 000000000..90efe1929 --- /dev/null +++ b/voip_sip_webrtc/models/voip_settings.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +import socket +import threading +import random +import string +import logging +import requests +_logger = logging.getLogger(__name__) +from openerp.http import request +import odoo +from socket import gethostname +from pprint import pprint +from time import gmtime, mktime +from os.path import exists, join +import os +import struct +from hashlib import sha256 + +from openerp import api, fields, models + +class VoipSettings(models.Model): + + _name = "voip.settings" + _inherit = 'res.config.settings' + + missed_call_action = fields.Selection([('nothing', 'Nothing')], string="Missed Call Action", help="What action is taken when the call is missed") + ringtone_id = fields.Many2one('voip.ringtone', string="Ringtone") + ringtone = fields.Binary(string="Default Ringtone") + ringtone_filename = fields.Char("Ringtone Filename") + ring_duration = fields.Integer(string="Ring Duration (Seconds)") + server_ip = fields.Char(string="IP Address") + + @api.multi + def set_values(self): + super(VoipSettings, self).set_values() + self.env['ir.default'].set('voip.settings', 'ringtone_id', self.ringtone_id.id) + self.env['ir.default'].set('voip.settings', 'ring_duration', self.ring_duration) + self.env['ir.default'].set('voip.settings', 'server_ip', self.server_ip) + + @api.model + def get_values(self): + res = super(VoipSettings, self).get_values() + res.update( + ringtone_id=self.env['ir.default'].get('voip.settings', 'ringtone_id'), + ring_duration=self.env['ir.default'].get('voip.settings', 'ring_duration'), + server_ip=self.env['ir.default'].get('voip.settings', 'server_ip') + ) + return res + + + diff --git a/voip_sip_webrtc/models/voip_voip.py b/voip_sip_webrtc/models/voip_voip.py new file mode 100644 index 000000000..e52bad244 --- /dev/null +++ b/voip_sip_webrtc/models/voip_voip.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +from openerp.http import request +import socket +import threading +import logging +_logger = logging.getLogger(__name__) + +from odoo import api, fields, models, registry + +class VoipVoip(models.Model): + + _name = "voip.voip" + _description = "Voip Functions" + + @api.model + def sip_read_message(self, data): + sip_dict = {} + for line in data.split("\n"): + sip_key = line.split(":")[0] + sip_value = line[len(sip_key) + 2:] + sip_dict[sip_key] = sip_value + + #Get from SIP address + from_sip = sip_dict['From'] + start = from_sip.index( "sip:" ) + 4 + end = from_sip.index( ";", start ) + sip_dict['from_sip'] = from_sip[start:end].replace(">","").strip() + + #Get to SIP address + sip_dict['to_sip'] = sip_dict['To'].split("sip:")[1].strip() + + return sip_dict + + @api.model + def start_sip_call(self, to_partner): + #Ask for media permission from the caller + mode = "audiocall" + constraints = {'audio': True} + notification = {'mode': mode, 'to_partner_id': to_partner, 'constraints': constraints, 'call_type': 'external'} + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.sip', self.env.user.partner_id.id), notification) + + @api.model + def start_incoming_sip_call(self, sip_invite, addr, sip_tag): + + sip_dict = self.sip_read_message(sip_invite) + + #Find the from partner + from_partner_id = self.env['res.partner'].sudo().search([('sip_address', '=', sip_dict['from_sip'] )]) + + #Find the to partner + to_partner_id = self.env['res.partner'].sudo().search([('sip_address', '=', sip_dict['to_sip'] )]) + + #SIP INVITE will continously send, only allow one call from this person at a time, as a future feature if multiple people call they are allowed to join the call with permission + if self.env['voip.call'].search_count([('status', '=', 'pending'), ('from_partner_id', '=', from_partner_id.id), ('partner_id', '=', to_partner_id.id)]) < 50: + + _logger.error("INVITE: " + str(sip_invite) ) + _logger.error("from partner:" + str(from_partner_id.name) ) + _logger.error("to partner:" + str(to_partner_id.name) ) + + #The call is created now so we can update it as a missed / rejected call or accepted, the timer for the call starts after being accepted though + voip_call = self.env['voip.call'].create({'type': 'external', 'direction': 'incoming', 'sip_tag': sip_tag}) + + ringtone = "/voip/ringtone/" + str(voip_call.id) + ".mp3" + ring_duration = self.env['ir.default'].get('voip.settings', 'ring_duration') + + #Assign the caller and callee partner + voip_call.from_partner_id = from_partner_id + voip_call.partner_id = to_partner_id + + #Add the to calle to the client list + self.env['voip.call.client'].sudo().create({'vc_id':voip_call.id, 'partner_id': to_partner_id.id, 'state':'joined', 'name': to_partner_id.name}) + + #Also add the external partner to the list but assume we already have media access, the long polling will be ignored since the from is external to the system + self.env['voip.call.client'].sudo().create({'vc_id':voip_call.id, 'partner_id': from_partner_id.id, 'state':'media_access', 'name': from_partner_id.name, 'sip_invite': sip_invite, 'sip_addr_host': addr[0], 'sip_addr_port': addr[1] }) + + #Send notification to callee + notification = {'voip_call_id': voip_call.id, 'ringtone': ringtone, 'ring_duration': ring_duration, 'from_name': from_partner_id.name, 'caller_partner_id': from_partner_id.id, 'direction': 'incoming', 'mode': "audiocall"} + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.notification', to_partner_id.id), notification) + + #Have to manually commit the new cursor? + self.env.cr.commit() \ No newline at end of file diff --git a/voip_sip_webrtc/security/ir.model.access.csv b/voip_sip_webrtc/security/ir.model.access.csv new file mode 100644 index 000000000..53b873d3e --- /dev/null +++ b/voip_sip_webrtc/security/ir.model.access.csv @@ -0,0 +1,4 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_voip_call","access voip.call","model_voip_call","base.group_user",1,1,1,0 +"access_voip_ringtone","access voip.ringetone","model_voip_ringtone","base.group_user",1,0,0,0 +"access_voip_call_client","access voip.call.client","model_voip_call_client","base.group_user",1,1,1,0 \ No newline at end of file diff --git a/voip_sip_webrtc/static/description/1.jpg b/voip_sip_webrtc/static/description/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d52706b34335bf728e946d7b8b9e55b9005abc68 GIT binary patch literal 71818 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
  • wTT7s0m`KQ9^o7ydB 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 Ao&W#< literal 0 HcmV?d00001 diff --git a/voip_sip_webrtc/static/description/2.jpg b/voip_sip_webrtc/static/description/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf8ccd38f9cb646de96651dd55aa972d0c1182e9 GIT binary patch literal 60447 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 Q@z;@5{7*qqd|$?Y08%c81ONa4 literal 0 HcmV?d00001 diff --git a/voip_sip_webrtc/static/description/3.jpg b/voip_sip_webrtc/static/description/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad8a66870a06331da1f8928041e91567de65b504 GIT binary patch literal 62596 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 literal 0 HcmV?d00001 diff --git a/voip_sip_webrtc/static/description/icon.png b/voip_sip_webrtc/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eb680ef42534d41fdf2e1d522a0a2cc5b6d9b828 GIT binary patch literal 1373 zcmX|>e>l?#9LG0J$Fd@8VJzd$Z5+obJ3p?>R(?B~{a~4PtCSz#)(}T`4RK`o)%@tF zkP*%Nsr$}Yww)^#Yp7-bVyg$$L`8?12pHE(Bh%XFk0R@3T zFn>Q{n3iQa8En*cFYt*8Eg&)YU_1!aR=8=Esju~hY`=&^5NKPsPT=;i(DT}%dD325 z66yGnq!cFSFo?}O1|&HFhm)*#IypPJd_#c5&1nyf_!IHrsf^d7fmfSZmVIy3>;lym zK@}(1=#aPF5x$|ngy<8tv82w`Ib2S>;NgF$hlt&3SLZiwgbAD9a5lp=30uz6e3#w> zXkJUlQktihZ>=vh+{)_kj9GZRxcYuLuI0v9jH8>ITW)*I9>43rau#t`m*n4So+A}D zE-3`FIDMnHXE=oGq-WTku1HCZ`A9GH!&8)c-}@=b)pEr>a-kbx!BXg2XUjn2~MHu2gyisdmW|;%DbWD_S46 z9Hf02RG}PT1P}`IILHxFihYp6P@Zt)IP(XmaKJV_e@C9_BA0_4W>pkz=PUm}bw@F6 z7*xPCeaKgqoWlNfh}U*lrS-Q{eVLVQj%d=BcmRIW{7s~FlQPe_|F<|;pw zpmX=|k=(85qNP`097N(7f;Ph$xO)nX2b6LcQFNbTpaT%5!+qmNz=C^)E#&1!8|nfU zLSDgMV!`#g!X+8~=9!#3MIHHYy_Ez1yY1Wbnof-D&f6k1@$~_m$xLM+>39i}9HKX-EX51chK{h1x(CGdMa- z=2R2+I6ye{T31^R*ZWA(t_`Z88Dcc%u|E`F$7&xn=0h{Q1S%a?MSnvK#+YXgT~UGf zyjjyMakK=CiAW1-j+uEr_Wto?ia8ml}UPxcndTpysXSE=m@XiL-)qRd0 z_)E({eZVE~>7B%UoI{H8z-fCPf1cLeE8Oou#ipc}C6~(#G<IJh+CwwX44ckqLrc{`_IRTluw}>yqZ*cPnsU>wGce$Or}Rr6ynQPMU#Dv}J86rC%SB3MuN{(aoGwEX5P5+%Ym= z6wVSq7_42g{G9hapWaG=jem-oWsrtmlGKQ6BX~L4U&Katd|U3^ zQ!aNzeSDbVXf};fBZ@yglR|CT4L{Rp#q^++uZ80#YQ(OznQ|*(qnhk3y}Nde_b`zK z6x-$~#H`yiOETs~D<>aSLxMvCpGko?Qx?=PYWSkp%9EOm$c3#+`w+MIc!ddpgtf{m z2&rlah_;BfO%nEPaxZ(wlM(CIdsTMJlrAHf>8=+>gCnE0&ZaY+&7FMZbff@>>g5R< zc(J>uSDJjhZ`*^$fS*GjiI|=MnGfy6A!q>;L}A dKdku*u?|Z6u`vB7@0$wU$bWALQRH(l^DkY3b@2cI literal 0 HcmV?d00001 diff --git a/voip_sip_webrtc/static/description/index.html b/voip_sip_webrtc/static/description/index.html new file mode 100644 index 000000000..291325957 --- /dev/null +++ b/voip_sip_webrtc/static/description/index.html @@ -0,0 +1,20 @@ +

    \ No newline at end of file diff --git a/voip_sip_webrtc/static/src/audio/blank.mp3 b/voip_sip_webrtc/static/src/audio/blank.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ef84d711faf50e8d4091522a1f8a2af280150b86 GIT binary patch literal 107291 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℘GC`E?X_<{O6+R}^(^ok| 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%0A!!(}- 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 q{eL_TUjtDgVHm;4LN{8v-} literal 0 HcmV?d00001 diff --git a/voip_sip_webrtc/static/src/audio/old_school_ringtone.mp3 b/voip_sip_webrtc/static/src/audio/old_school_ringtone.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a9b1c57337f9b925ec1a8e320988a7a94ab03bea GIT binary patch literal 230712 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�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

    BE#o8>6&JI79sM`JsI5hBxD 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

    Y@~G#`4K1Pc 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 track.stop()); + } + + if (remoteStream) { + remoteStream.getTracks().forEach(track => track.stop()); + } + + //Destroy the notifcation and stop the countdown because the call was accepted or rejected, no need to wait until timeout + if (typeof outgoingNotification !== "undefined") { + clearInterval(outgoing_ring_interval); + outgoingNotification.destroy(true); + } + + if (typeof incomingNotification !== "undefined") { + clearInterval(call_interval); + incomingNotification.destroy(true); + + mySound.pause(); + mySound.currentTime = 0; + } + + $("#voip_text").html("Starting Call..."); + $(".s-voip-manager").css("display","none"); + + + + got_remote_description = false; + + } + + + }).bind(this)); + + }); + return this._super.apply(this, arguments); + }, + +}); + +function resetCall() { + + //Stop all audio / video tracks + if (localStream) { + localStream.getTracks().forEach(track => track.stop()); + } + + if (remoteStream) { + remoteStream.getTracks().forEach(track => track.stop()); + } + + //Destroy the notifcation and stop the countdown because the call was accepted or rejected, no need to wait until timeout + if (typeof outgoingNotification !== "undefined") { + clearInterval(outgoing_ring_interval); + outgoingNotification.destroy(true); + } + + if (typeof incomingNotification !== "undefined") { + clearInterval(call_interval); + incomingNotification.destroy(true); + + mySound.pause(); + mySound.currentTime = 0; + } + + $("#voip_text").html("Starting Call..."); + $(".s-voip-manager").css("display","none"); + + got_remote_description = false; + +} + +function errorHandler(error) { + console.log(error); +} + +function onMessage(message) { + + + if (message.body.includes(""); + + var aor = message.remoteIdentity.uri.user + "@" + message.remoteIdentity.uri.host + + $("#sip-panel-uri").html(message.remoteIdentity.displayName) + + window.to_sip = aor; + + } + +} + +function onInvite(session) { + + console.log("Call Type: SIP"); + + $(".s-voip-manager").css("display","block"); + + window.sip_session = session; + + + + mode = "audiocall"; + call_type = "external"; + + var aor = session.remoteIdentity.uri.user + "@" + session.remoteIdentity.uri.host; + + rpc.query({ + model: 'voip.server', + method: 'sip_call_notify', + args: [mode, call_type, aor] + }).then(function(result){ + console.log("Incoming SIP Call Notify"); + }); + +} + +function onPresence(notification) { + console.log("Presence"); + console.log(notification.request.body); +} + + +function processIceQueue() { + console.log("Process Ice Queue"); + for (var i = ice_candidate_queue.length - 1; i >= 0; i--) { + console.log("Add ICE Candidate:"); + console.log(ice_candidate_queue[i]); + + window.peerConnection.addIceCandidate(new RTCIceCandidate( ice_candidate_queue[i] )).catch(errorHandler); + ice_candidate_queue.splice(i, 1); + } + +} + +function createCall(description) { + + window.peerConnection.setLocalDescription(description).then(function() { + + //Send the call notification to the callee + rpc.query({ + model: 'voip.server', + method: 'voip_call_notify', + args: [mode, to_partner_id, call_type, description] + }).then(function(result){ + console.log("Notify Callee of incoming phone call"); + }); + + }).catch(errorHandler); +} + +function createdDescription(description) { + + window.peerConnection.setLocalDescription(description).then(function() { + + rpc.query({ + model: 'voip.call', + method: 'voip_call_sdp', + args: [[call_id], description] + }).then(function(result){ + console.log("Send SDP: " + description); + }); + + }).catch(errorHandler); +} + +function messageBankDescription(description) { + console.log('Created Message Bank Description: ' + description.sdp); + + window.peerConnection.setLocalDescription(description).then(function() { + + //Send the sdp offer to the server + rpc.query({ + model: 'voip.call', + method: 'message_bank', + args: [[call_id], description] + }).then(function(result){ + console.log("Message Bank Call"); + }); + + + }).catch(errorHandler); +} + +function gotIceCandidate(event) { + if(event.candidate != null) { + + rpc.query({ + model: 'voip.call', + method: 'voip_call_ice', + args: [[call_id], event.candidate] + }).then(function(result){ + console.log("Send ICE Candidate: " + event.candidate); + }); + + } +} + +function gotRemoteStream(event) { + console.log("Got Remote Stream: " + event.stream); + remoteVideo.srcObject = event.stream; + remoteStream = event.stream; + + var startDate = new Date(); + + //Hide the image and replace it with the video stream + $("#toPartnerImage").css('display','none'); + $("#remoteVideo").css('display','block'); + + //For calls with multiple streams (e.g. video calls) this get called twice so we use time difference as a work around + call_interval = setInterval(function() { + var endDate = new Date(); + var seconds = (endDate.getTime() - startDate.getTime()) / 1000; + + $("#voip_text").html( Math.round(seconds) + " seconds"); + }, 1000); + + + rpc.query({ + model: 'voip.call', + method: 'begin_call', + args: [[call_id]], + context: weContext.get() + }).then(function(result){ + console.log("Begin Call"); + }); + +} + +function sipOnError(request) { + var cause = request.cause; + + if (cause === SIP.C.causes.REJECTED) { + alert("Call was rejected"); + } else { + console.log("SIP Call Error"); + console.log(cause); + alert(request.cause); + } +} + +var chatSubscription; + +$(document).on('click', '#voip_end_call', function(){ + + if (call_type == "external") { + window.sip_session.bye(); + } else { + + rpc.query({ + model: 'voip.call', + method: 'end_call', + args: [[call_id]] + }).then(function(result){ + console.log("End Call"); + }); + } + +}); + +$(document).on('click', '#sip_message_send_button', function(){ + window.userAgent.message(window.to_sip, $("#sip_address_textbox").val() ); + + //Add the message to the chat log + $("#sip-message-log").append("->" + $("#sip_address_textbox").val() + "
    "); + + //Clear the message + $("#sip_address_textbox").val(""); + + //TODO also add to chatter +}); + +$(document).on('click', '#voip_full_screen', function(){ + $(".s-voip-manager").css("width","calc(100vw - 20px)"); + $(".s-voip-manager").css("height","calc(100vh - 20px)"); + $(".s-voip-manager").css("left","0px"); + $(".s-voip-manager").css("top","0px"); + $(".s-voip-manager").css("margin","10px"); + $(".s-voip-manager").css("resize","none"); + $("#remoteVideo").css("width","auto"); +}); + +var VoipCallOutgoingNotification = Notification.extend({ + template: "VoipCallOutgoingNotification", + + init: function(parent, title, text, call_id) { + this._super(parent, title, text, true); + }, + start: function() { + myNotif = this; + this._super.apply(this, arguments); + secondsLeft = countdown; + $("#callsecondsoutgoingleft").html(secondsLeft); + + outgoing_ring_interval = setInterval(function() { + $("#callsecondsoutgoingleft").html(secondsLeft); + if (secondsLeft == 0) { + + rpc.query({ + model: 'voip.call', + method: 'miss_call', + args: [[call_id]] + }).then(function(result){ + console.log("Missed Call"); + }); + + //Send the offer to message bank (server) + /* + if (mode == "audiocall") { + window.peerConnection.createOffer().then(messageBankDescription).catch(errorHandler); + } + */ + + //Play the missed call audio + mySound = new Audio("/voip/miss/" + call_id + ".mp3"); + mySound.play(); + + clearInterval(outgoing_ring_interval); + resetCall(); + myNotif.destroy(true); + } + + secondsLeft--; + }, 1000); + + }, +}); + +var VoipCallIncomingNotification = Notification.extend({ + template: "VoipCallIncomingNotification", + + init: function(parent, title, text, call_id) { + this._super(parent, title, text, true); + + + this.events = _.extend(this.events || {}, { + 'click .link2accept': function() { + + rpc.query({ + model: 'voip.call', + method: 'accept_call', + args: [[call_id]], + context: weContext.get() + }).then(function(result){ + console.log("Accept Call"); + }); + + //Clear the countdown now + clearInterval(incoming_ring_interval); + + mySound.pause(); + mySound.currentTime = 0; + + //Constraints are slightly different for the callee e.g. for callee we don't need screen sharing access only audio + var constraints = {}; + if (mode == "videocall") { + constraints = {audio: true, video: true}; + } else if (mode == "audiocall") { + constraints = {audio: true}; + } else if (mode == "screensharing") { + //constraints = {'audio': true, 'OfferToReceiveVideo': true}; + constraints = {'audio': true, 'video': {'mediaSource': "screen"}}; + } + + console.log(call_type); + console.log(constraints); + if (call_type == "external") { + console.log("Accept SIP Call"); + + console.log(window.sip_session); + + window.sip_session.accept({ + media: { + constraints: { + audio: true + }, + render: { + remote: document.getElementById('remoteVideo'), + local: document.getElementById('localVideo') + } + } + }); + + window.sip_session.on('failed', sipOnError); + window.sip_session.on('bye', resetCall); + + } else { + + //Ask for media access only if the call is accepted + if (navigator.webkitGetUserMedia) { + navigator.webkitGetUserMedia(constraints, getUserMediaSuccess, getUserMediaError); + } else { + window.navigator.mediaDevices.getUserMedia(constraints).then(getUserMediaSuccess).catch(getUserMediaError); + } + } + + this.destroy(true); + }, + + 'click .link2reject': function() { + + rpc.query({ + model: 'voip.call', + method: 'reject_call', + args: [[call_id]] + }).then(function(result){ + console.log("Reject Call"); + }); + + //Clear the countdown now + clearInterval(incoming_ring_interval); + + mySound.pause(); + mySound.currentTime = 0; + this.destroy(true); + }, + }); + }, + start: function() { + myNotif = this; + this._super.apply(this, arguments); + secondsLeft = countdown; + $("#callsecondsincomingleft").html(secondsLeft); + + incoming_ring_interval = setInterval(function() { + $("#callsecondsincomingleft").html(secondsLeft); + if (secondsLeft == 0) { + mySound.pause(); + mySound.currentTime = 0; + resetCall(); + clearInterval(incoming_ring_interval); + myNotif.destroy(true); + } + + secondsLeft--; + }, 1000); + + }, +}); + + +return { + VoipCallClient: VoipCallClient, +}; + + +}); \ No newline at end of file diff --git a/voip_sip_webrtc/static/src/js/sip-0.8.3.min.js b/voip_sip_webrtc/static/src/js/sip-0.8.3.min.js new file mode 100644 index 000000000..9e1606e07 --- /dev/null +++ b/voip_sip_webrtc/static/src/js/sip-0.8.3.min.js @@ -0,0 +1,38 @@ +/*! + * + * SIP version 0.8.3 + * Copyright (c) 2014-2017 Junction Networks, Inc + * Homepage: http://sipjs.com + * License: http://sipjs.com/license/ + * + * + * ~~~SIP.js contains substantial portions of JsSIP under the following license~~~ + * Homepage: http://jssip.net + * Copyright (c) 2012-2013 José Luis Millán - Versatica + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * ~~~ end JsSIP license ~~~ + * + * + * + * + */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SIP=t():e.SIP=t()}(this,function(){return function(e){function t(s){if(i[s])return i[s].exports;var r=i[s]={i:s,l:!1,exports:{}};return e[s].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var i={};return t.m=e,t.c=i,t.d=function(e,i,s){t.o(e,i)||Object.defineProperty(e,i,{configurable:!1,enumerable:!0,get:s})},t.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(i,"a",i),i},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=1)}([function(e,t){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(i=window)}e.exports=i},function(e,t,i){"use strict";e.exports=i(2)(i(34))},function(e,t,i){"use strict";e.exports=function(e){var t=i(3),s=t.version,r=t.title,n=Object.defineProperties({},{version:{get:function(){return s}},name:{get:function(){return r}}});return i(4)(n,e),n.LoggerFactory=i(5)(e.console),n.EventEmitter=i(6)(),n.C=i(8)(n.name,n.version),n.Exceptions=i(9),n.Timers=i(10)(e.timers),n.Transport=e.Transport(n,e.WebSocket),i(11)(n),i(12)(n),i(13)(n),i(14)(n),i(15)(n),i(16)(n),i(18)(n),i(19)(n),n.SessionDescriptionHandler=i(20)(n.EventEmitter),i(21)(n),i(22)(n),i(23)(n,e),i(25)(n),i(26)(n,e),i(28)(n),n.DigestAuthentication=i(29)(n.Utils),n.Grammar=i(30)(n),n.WebRTC={Modifiers:i(32)(n),Simple:i(33)(n)},n}},function(e,t){e.exports={name:"sip.js",title:"SIP.js",description:"A simple, intuitive, and powerful JavaScript signaling library",version:"0.8.3",main:"dist/sip.min.js",browser:{"./src/environment.js":"./src/environment_browser.js"},homepage:"http://sipjs.com",author:"OnSIP (http://sipjs.com/aboutus/)",contributors:[{url:"https://github.com/onsip/SIP.js/blob/master/THANKS.md"}],repository:{type:"git",url:"https://github.com/onsip/SIP.js.git"},keywords:["sip","websocket","webrtc","library","javascript"],devDependencies:{eslint:"^4.9.0","eslint-loader":"^1.9.0","jasmine-core":"^2.8.0",karma:"^1.7.1","karma-cli":"^1.0.1","karma-jasmine":"^1.1.0","karma-jasmine-html-reporter":"^0.2.2","karma-mocha-reporter":"^2.2.5","karma-phantomjs-launcher":"^1.0.4",pegjs:"^0.10.0","pegjs-loader":"^0.5.4","uglifyjs-webpack-plugin":"^1.0.1",webpack:"^3.8.1"},engines:{node:">=4.0"},license:"MIT",scripts:{build:"webpack --progress && cp dist/sip.js dist/sip-$npm_package_version.js && cp dist/sip.min.js dist/sip-$npm_package_version.min.js",browserTest:"sleep 2 && open http://0.0.0.0:9876/debug.html & karma start --reporters kjhtml --no-single-run",commandLineTest:"karma start --reporters mocha --browsers PhantomJS --single-run",buildAndTest:"npm run build && npm run commandLineTest"},dependencies:{ws:"^1.0.1"},optionalDependencies:{promiscuous:"^0.6.0"}}},function(e,t,i){"use strict";e.exports=function(e,t){var i;i={Promise:t.Promise,defer:function(){var e={};return e.promise=new i.Promise(function(t,i){e.resolve=t,e.reject=i}),e},reducePromises:function(t,i){return t.reduce(function(e,t){return e=e.then(t)},e.Utils.Promise.resolve(i))},augment:function(e,t,i,s){var r,n;n=t.prototype;for(r in n)(s||void 0===e[r])&&(e[r]=n[r]);t.apply(e,i)},optionsOverride:function(e,t,i,s,r,n){s&&e[i]&&r.warn(i+" is deprecated, please use "+t+" instead"),e[t]&&e[i]&&r.warn(t+" overriding "+i),e[t]=e[t]||e[i]||n},str_utf8_length:function(e){return encodeURIComponent(e).replace(/%[A-F\d]{2}/g,"U").length},generateFakeSDP:function(e){if(e){var t=e.indexOf("o="),i=e.indexOf("\r\n",t);return"v=0\r\n"+e.slice(t,i)+"\r\ns=-\r\nt=0 0\r\nc=IN IP4 0.0.0.0"}},isFunction:function(e){return void 0!==e&&"[object Function]"===Object.prototype.toString.call(e)},isDecimal:function(e){return!isNaN(e)&&parseFloat(e)===parseInt(e,10)},createRandomToken:function(e,t){var i,s,r="";for(t=t||32,i=0;i699)throw new TypeError("Invalid status_code: "+t);if(t)return e.Utils.getReasonHeaderValue(t,i)},buildStatusLine:function(e,t){if(e=e||null,t=t||null,!e||e<100||e>699)throw new TypeError("Invalid status_code: "+e);if(t&&"string"!=typeof t&&!(t instanceof String))throw new TypeError("Invalid reason_phrase: "+t);return t=i.getReasonPhrase(e,t),"SIP/2.0 "+e+" "+t+"\r\n"},getRandomTestNetIP:function(){return"192.0.2."+function(e,t){return Math.floor(Math.random()*(t-e+1)+e)}(1,254)},calculateMD5:function(e){function t(e,t){return e<>>32-t}function i(e,t){var i,s,r,n,o;return r=2147483648&e,n=2147483648&t,i=1073741824&e,s=1073741824&t,o=(1073741823&e)+(1073741823&t),i&s?2147483648^o^r^n:i|s?1073741824&o?3221225472^o^r^n:1073741824^o^r^n:o^r^n}function s(e,t,i){return e&t|~e&i}function r(e,t,i){return e&i|t&~i}function n(e,t,i){return e^t^i}function o(e,t,i){return t^(e|~i)}function a(e,r,n,o,a,c,h){return e=i(e,i(i(s(r,n,o),a),h)),i(t(e,c),r)}function c(e,s,n,o,a,c,h){return e=i(e,i(i(r(s,n,o),a),h)),i(t(e,c),s)}function h(e,s,r,o,a,c,h){return e=i(e,i(i(n(s,r,o),a),h)),i(t(e,c),s)}function u(e,s,r,n,a,c,h){return e=i(e,i(i(o(s,r,n),a),h)),i(t(e,c),s)}function l(e){var t,i,s="",r="";for(i=0;i<=3;i++)t=e>>>8*i&255,r="0"+t.toString(16),s+=r.substr(r.length-2,2);return s}var d,p,g,f,T,m,_,E,S,C=[];for(e=function(e){e=e.replace(/\r\n/g,"\n");for(var t="",i=0;i127&&s<2048?(t+=String.fromCharCode(s>>6|192),t+=String.fromCharCode(63&s|128)):(t+=String.fromCharCode(s>>12|224),t+=String.fromCharCode(s>>6&63|128),t+=String.fromCharCode(63&s|128))}return t}(e),C=function(e){for(var t,i=e.length,s=i+8,r=(s-s%64)/64,n=16*(r+1),o=Array(n-1),a=0,c=0;c>>29,o}(e),m=1732584193,_=4023233417,E=2562383102,S=271733878,d=0;d=0&&i<=3?t=i:i>3?t=3:s.hasOwnProperty(i)?t=s[i]:e.error('invalid "level" parameter value: '+JSON.stringify(i))}},connector:{get:function(){return r},set:function(t){null===t||""===t||void 0===t?r=null:"function"==typeof t?r=t:e.error('invalid "connector" parameter value: '+JSON.stringify(t))}}})};return i.prototype.print=function(t,i,s,r){if("string"==typeof r){var n=[new Date,i];s&&n.push(s),r=n.concat(r).join(" | ")}t.call(e,r)},Object.keys(s).forEach(function(r){t.prototype[r]=function(e){this.logger[r](this.category,this.label,e)},i.prototype[r]=function(t,i,n){this.level>=s[r]&&(this.builtinEnabled&&this.print(e[r],t,i,n),this.connector&&this.connector(r,t,i,n))}}),i.prototype.getLogger=function(e,i){var s;return i&&3===this.level?new t(this,e,i):this.loggers[e]?this.loggers[e]:(s=new t(this,e),this.loggers[e]=s,s)},i}},function(e,t,i){"use strict";var s=i(7).EventEmitter;e.exports=function(){function e(){s.call(this)}return e.prototype=Object.create(s.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),e}},function(e,t){function i(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function s(e){return"function"==typeof e}function r(e){return"number"==typeof e}function n(e){return"object"==typeof e&&null!==e}function o(e){return void 0===e}e.exports=i,i.EventEmitter=i,i.prototype._events=void 0,i.prototype._maxListeners=void 0,i.defaultMaxListeners=10,i.prototype.setMaxListeners=function(e){if(!r(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},i.prototype.emit=function(e){var t,i,r,a,c,h;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var u=new Error('Uncaught, unspecified "error" event. ('+t+")");throw u.context=t,u}if(i=this._events[e],o(i))return!1;if(s(i))switch(arguments.length){case 1:i.call(this);break;case 2:i.call(this,arguments[1]);break;case 3:i.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),i.apply(this,a)}else if(n(i))for(a=Array.prototype.slice.call(arguments,1),h=i.slice(),r=h.length,c=0;c0&&this._events[e].length>r&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},i.prototype.on=i.prototype.addListener,i.prototype.once=function(e,t){function i(){this.removeListener(e,i),r||(r=!0,t.apply(this,arguments))}if(!s(t))throw TypeError("listener must be a function");var r=!1;return i.listener=t,this.on(e,i),this},i.prototype.removeListener=function(e,t){var i,r,o,a;if(!s(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(i=this._events[e],o=i.length,r=-1,i===t||s(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(a=o;a-- >0;)if(i[a]===t||i[a].listener&&i[a].listener===t){r=a;break}if(r<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(r,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},i.prototype.removeAllListeners=function(e){var t,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(i=this._events[e],s(i))this.removeListener(e,i);else if(i)for(;i.length;)this.removeListener(e,i[i.length-1]);return delete this._events[e],this},i.prototype.listeners=function(e){return this._events&&this._events[e]?s(this._events[e])?[this._events[e]]:this._events[e].slice():[]},i.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(s(t))return 1;if(t)return t.length}return 0},i.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t,i){"use strict";e.exports=function(e,t){return{USER_AGENT:e+"/"+t,SIP:"sip",SIPS:"sips",causes:{CONNECTION_ERROR:"Connection Error",REQUEST_TIMEOUT:"Request Timeout",SIP_FAILURE_CODE:"SIP Failure Code",INTERNAL_ERROR:"Internal Error",BUSY:"Busy",REJECTED:"Rejected",REDIRECTED:"Redirected",UNAVAILABLE:"Unavailable",NOT_FOUND:"Not Found",ADDRESS_INCOMPLETE:"Address Incomplete",INCOMPATIBLE_SDP:"Incompatible SDP",AUTHENTICATION_ERROR:"Authentication Error",DIALOG_ERROR:"Dialog Error",WEBRTC_NOT_SUPPORTED:"WebRTC Not Supported",WEBRTC_ERROR:"WebRTC Error",CANCELED:"Canceled",NO_ANSWER:"No Answer",EXPIRES:"Expires",NO_ACK:"No ACK",NO_PRACK:"No PRACK",USER_DENIED_MEDIA_ACCESS:"User Denied Media Access",BAD_MEDIA_DESCRIPTION:"Bad Media Description",RTP_TIMEOUT:"RTP Timeout"},supported:{UNSUPPORTED:"none",SUPPORTED:"supported",REQUIRED:"required"},SIP_ERROR_CAUSES:{REDIRECTED:[300,301,302,305,380],BUSY:[486,600],REJECTED:[403,603],NOT_FOUND:[404,604],UNAVAILABLE:[480,410,408,430],ADDRESS_INCOMPLETE:[484],INCOMPATIBLE_SDP:[488,606],AUTHENTICATION_ERROR:[401,407]},ACK:"ACK",BYE:"BYE",CANCEL:"CANCEL",INFO:"INFO",INVITE:"INVITE",MESSAGE:"MESSAGE",NOTIFY:"NOTIFY",OPTIONS:"OPTIONS",REGISTER:"REGISTER",UPDATE:"UPDATE",SUBSCRIBE:"SUBSCRIBE",REFER:"REFER",PRACK:"PRACK",REASON_PHRASE:{100:"Trying",180:"Ringing",181:"Call Is Being Forwarded",182:"Queued",183:"Session Progress",199:"Early Dialog Terminated",200:"OK",202:"Accepted",204:"No Notification",300:"Multiple Choices",301:"Moved Permanently",302:"Moved Temporarily",305:"Use Proxy",380:"Alternative Service",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",410:"Gone",412:"Conditional Request Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Unsupported URI Scheme",417:"Unknown Resource-Priority",420:"Bad Extension",421:"Extension Required",422:"Session Interval Too Small",423:"Interval Too Brief",428:"Use Identity Header",429:"Provide Referrer Identity",430:"Flow Failed",433:"Anonymity Disallowed",436:"Bad Identity-Info",437:"Unsupported Certificate",438:"Invalid Identity Header",439:"First Hop Lacks Outbound Support",440:"Max-Breadth Exceeded",469:"Bad Info Package",470:"Consent Needed",478:"Unresolvable Destination",480:"Temporarily Unavailable",481:"Call/Transaction Does Not Exist",482:"Loop Detected",483:"Too Many Hops",484:"Address Incomplete",485:"Ambiguous",486:"Busy Here",487:"Request Terminated",488:"Not Acceptable Here",489:"Bad Event",491:"Request Pending",493:"Undecipherable",494:"Security Agreement Required",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Server Time-out",505:"Version Not Supported",513:"Message Too Large",580:"Precondition Failure",600:"Busy Everywhere",603:"Decline",604:"Does Not Exist Anywhere",606:"Not Acceptable"},OPTION_TAGS:{"100rel":!0,199:!0,answermode:!0,"early-session":!0,eventlist:!0,explicitsub:!0,"from-change":!0,"geolocation-http":!0,"geolocation-sip":!0,gin:!0,gruu:!0,histinfo:!0,ice:!0,join:!0,"multiple-refer":!0,norefersub:!0,nosub:!0,outbound:!0,path:!0,policy:!0,precondition:!0,pref:!0,privacy:!0,"recipient-list-invite":!0,"recipient-list-message":!0,"recipient-list-subscribe":!0,replaces:!0,"resource-priority":!0,"sdp-anat":!0,"sec-agree":!0,tdialog:!0,timer:!0,uui:!0}}}},function(e,t,i){"use strict";e.exports={ConfigurationError:function(){var e=function(e,t){this.code=1,this.name="CONFIGURATION_ERROR",this.parameter=e,this.value=t,this.message=this.value?"Invalid value "+JSON.stringify(this.value)+' for parameter "'+this.parameter+'"':"Missing parameter: "+this.parameter};return e.prototype=new Error,e}(),InvalidStateError:function(){var e=function(e){this.code=2,this.name="INVALID_STATE_ERROR",this.status=e,this.message="Invalid status: "+e};return e.prototype=new Error,e}(),NotSupportedError:function(){var e=function(e){this.code=3,this.name="NOT_SUPPORTED_ERROR",this.message=e};return e.prototype=new Error,e}(),GetDescriptionError:function(){var e=function(e){this.code=4,this.name="GET_DESCRIPTION_ERROR",this.message=e};return e.prototype=new Error,e}(),RenegotiationError:function(){var e=function(e){this.code=5,this.name="RENEGOTIATION_ERROR",this.message=e};return e.prototype=new Error,e}()}},function(e,t,i){"use strict";var s=500;e.exports=function(e){var t={T1:s,T2:4e3,T4:5e3,TIMER_B:32e3,TIMER_D:0,TIMER_F:32e3,TIMER_H:32e3,TIMER_I:0,TIMER_J:0,TIMER_K:0,TIMER_L:32e3,TIMER_M:32e3,TIMER_N:32e3,PROVISIONAL_RESPONSE_INTERVAL:6e4};return["setTimeout","clearTimeout","setInterval","clearInterval"].forEach(function(i){t[i]=function(){return e[i].apply(e,arguments)}}),t}},function(e,t,i){"use strict";e.exports=function(e){function t(e,t){var i=t,s=0,r=0;if(e.substring(i,i+2).match(/(^\r\n)/))return-2;for(;0===s;){if(-1===(r=e.indexOf("\r\n",i)))return r;!e.substring(r+2,r+4).match(/(^\r\n)/)&&e.charAt(r+2).match(/(^\s+)/)?i=r+2:s=r}return s}function i(t,i,s,r){var n,o,a,c,h=i.indexOf(":",s),u=i.substring(s,h).trim(),l=i.substring(h+1,r).trim();switch(u.toLowerCase()){case"via":case"v":t.addHeader("via",l),1===t.getHeaders("via").length?(c=t.parseHeader("Via"))&&(t.via=c,t.via_branch=c.branch):c=0;break;case"from":case"f":t.setHeader("from",l),c=t.parseHeader("from"),c&&(t.from=c,t.from_tag=c.getParam("tag"));break;case"to":case"t":t.setHeader("to",l),c=t.parseHeader("to"),c&&(t.to=c,t.to_tag=c.getParam("tag"));break;case"record-route":if(-1===(c=e.Grammar.parse(l,"Record_Route"))){c=void 0;break}for(a=c.length,o=0;o",a+=r.to_tag?";tag="+r.to_tag:"",this.to=new e.NameAddrHeader.parse(a),this.setHeader("to",a),d=r.from_uri||s.configuration.uri,c=r.from_displayName||0===r.from_displayName?'"'+r.from_displayName+'" ':s.configuration.displayName?'"'+s.configuration.displayName+'" ':"",c+="<"+(d&&d.toRaw?d.toRaw():d)+">;tag=",c+=r.from_tag||e.Utils.newTag(),this.from=new e.NameAddrHeader.parse(c),this.setHeader("from",c),h=r.call_id||s.configuration.sipjsId+e.Utils.createRandomToken(15),this.call_id=h,this.setHeader("call-id",h),u=r.cseq||Math.floor(1e4*Math.random()),this.cseq=u,this.setHeader("cseq",u+" "+t)},i.prototype={setHeader:function(t,i){this.headers[e.Utils.headerize(t)]=i instanceof Array?i:[i]},getHeader:function(t){var i,s,r=this.extraHeaders.length,n=this.headers[e.Utils.headerize(t)];if(n){if(n[0])return n[0]}else for(i=new RegExp("^\\s*"+t+"\\s*:","i"),s=0;s=this.headers[t].length?void this.logger.log('not so many "'+t+'" headers present'):(s=this.headers[t][i],r=s.raw,s.parsed?s.parsed:(n=e.Grammar.parse(r,t.replace(/-/g,"_")),-1===n?(this.headers[t].splice(i,1),void this.logger.warn('error parsing "'+t+'" header field with value "'+r+'"')):(s.parsed=n,n))):void this.logger.log('header "'+t+'" not present')},s:function(e,t){return this.parseHeader(e,t)},setHeader:function(t,i){var s={raw:i};this.headers[e.Utils.headerize(t)]=[s]},toString:function(){return this.data}},r=function(e){this.logger=e.getLogger("sip.sipmessage"),this.ua=e,this.headers={},this.ruri=null,this.transport=null,this.server_transaction=null},r.prototype=new s,r.prototype.reply=function(i,s,r,n,o,a){var c,h,u,l,d,p=this.getHeader("To"),g=0,f=0;if(d=e.Utils.buildStatusLine(i,s),r=(r||[]).slice(),this.method===e.C.INVITE&&i>100&&i<=200)for(c=this.getHeaders("record-route"),u=c.length,g;g100?p+=";tag="+e.Utils.newTag():this.to_tag&&!this.s("to").hasParam("tag")&&(p+=";tag="+this.to_tag),d+="To: "+p+"\r\n",d+="From: "+this.getHeader("From")+"\r\n",d+="Call-ID: "+this.call_id+"\r\n",d+="CSeq: "+this.cseq+" "+this.method+"\r\n",u=r.length,l=0;l100?s+=";tag="+e.Utils.newTag():this.to_tag&&!this.s("to").hasParam("tag")&&(s+=";tag="+this.to_tag),r+="To: "+s+"\r\n",r+="From: "+this.getHeader("From")+"\r\n",r+="Call-ID: "+this.call_id+"\r\n",r+="CSeq: "+this.cseq+" "+this.method+"\r\n",r+="User-Agent: "+this.ua.configuration.userAgentString+"\r\n",r+="Content-Length: 0\r\n\r\n",this.transport.send(r)},n=function(e){this.logger=e.getLogger("sip.sipmessage"),this.headers={},this.status_code=null,this.reason_phrase=null},n.prototype=new s,e.OutgoingRequest=i,e.IncomingRequest=r,e.IncomingResponse=n}},function(e,t,i){"use strict";e.exports=function(e){var t;t=function(t,i,s,r,n,o){var a,c,h,u;if(!s)throw new TypeError('missing or invalid "host" parameter');t=t||e.C.SIP,this.parameters={},this.headers={};for(a in n)this.setParam(a,n[a]);for(c in o)this.setHeader(c,o[c]);h={scheme:t,user:i,host:s,port:r},u={scheme:t.toLowerCase(),user:i,host:s.toLowerCase(),port:r},Object.defineProperties(this,{_normal:{get:function(){return u}},_raw:{get:function(){return h}},scheme:{get:function(){return u.scheme},set:function(e){h.scheme=e,u.scheme=e.toLowerCase()}},user:{get:function(){return u.user},set:function(e){u.user=h.user=e}},host:{get:function(){return u.host},set:function(e){h.host=e,u.host=e.toLowerCase()}},aor:{get:function(){return u.user+"@"+u.host}},port:{get:function(){return u.port},set:function(e){u.port=h.port=0===e?e:parseInt(e,10)||null}}})},t.prototype={setParam:function(e,t){e&&(this.parameters[e.toLowerCase()]=void 0===t||null===t?null:t.toString().toLowerCase())},getParam:function(e){if(e)return this.parameters[e.toLowerCase()]},hasParam:function(e){if(e)return this.parameters.hasOwnProperty(e.toLowerCase())&&!0||!1},deleteParam:function(e){var t;if(e=e.toLowerCase(),this.parameters.hasOwnProperty(e))return t=this.parameters[e],delete this.parameters[e],t},clearParams:function(){this.parameters={}},setHeader:function(t,i){this.headers[e.Utils.headerize(t)]=i instanceof Array?i:[i]},getHeader:function(t){if(t)return this.headers[e.Utils.headerize(t)]},hasHeader:function(t){if(t)return this.headers.hasOwnProperty(e.Utils.headerize(t))&&!0||!1},deleteHeader:function(t){var i;if(t=e.Utils.headerize(t),this.headers.hasOwnProperty(t))return i=this.headers[t],delete this.headers[t],i},clearHeaders:function(){this.headers={}},clone:function(){return new t(this._raw.scheme,this._raw.user,this._raw.host,this._raw.port,JSON.parse(JSON.stringify(this.parameters)),JSON.parse(JSON.stringify(this.headers)))},toRaw:function(){return this._toString(this._raw)},toString:function(){return this._toString(this._normal)},_toString:function(t){var i,s,r,n,o=[];n=t.scheme+":",t.scheme.toLowerCase().match("^sips?$")||(n+="//"),t.user&&(n+=e.Utils.escapeUser(t.user)+"@"),n+=t.host,(t.port||0===t.port)&&(n+=":"+t.port);for(s in this.parameters)n+=";"+s,null!==this.parameters[s]&&(n+="="+this.parameters[s]);for(i in this.headers)for(r in this.headers[i])o.push(i+"="+this.headers[i][r]);return o.length>0&&(n+="?"+o.join("&")),n}},t.parse=function(t){return t=e.Grammar.parse(t,"SIP_URI"),-1!==t?t:void 0},e.URI=t}},function(e,t,i){"use strict";e.exports=function(e){var t;t=function(t,i,s){var r;if(!(t&&t instanceof e.URI))throw new TypeError('missing or invalid "uri" parameter');this.uri=t,this.parameters={};for(r in s)this.setParam(r,s[r]);Object.defineProperties(this,{friendlyName:{get:function(){return this.displayName||t.aor}},displayName:{get:function(){return i},set:function(e){i=0===e?"0":e}}})},t.prototype={setParam:function(e,t){e&&(this.parameters[e.toLowerCase()]=void 0===t||null===t?null:t.toString())},getParam:e.URI.prototype.getParam,hasParam:e.URI.prototype.hasParam,deleteParam:e.URI.prototype.deleteParam,clearParams:e.URI.prototype.clearParams,clone:function(){return new t(this.uri.clone(),this.displayName,JSON.parse(JSON.stringify(this.parameters)))},toString:function(){var e,t;e=this.displayName||0===this.displayName?'"'+this.displayName+'" ':"",e+="<"+this.uri.toString()+">";for(t in this.parameters)e+=";"+t,null!==this.parameters[t]&&(e+="="+this.parameters[t]);return e}},t.parse=function(t){return t=e.Grammar.parse(t,"Name_Addr_Header"),-1!==t?t:void 0},e.NameAddrHeader=t}},function(e,t,i){"use strict";e.exports=function(e){function t(e,t,i){var s;return s="SIP/2.0/"+(e.ua.configuration.hackViaTcp?"TCP":t.server.scheme),s+=" "+e.ua.configuration.viaHost+";branch="+i,e.ua.configuration.forceRport&&(s+=";rport"),s}var i={STATUS_TRYING:1,STATUS_PROCEEDING:2,STATUS_CALLING:3,STATUS_ACCEPTED:4,STATUS_COMPLETED:5,STATUS_TERMINATED:6,STATUS_CONFIRMED:7,NON_INVITE_CLIENT:"nict",NON_INVITE_SERVER:"nist",INVITE_CLIENT:"ict",INVITE_SERVER:"ist"},s=function(e,s,r){var n;this.type=i.NON_INVITE_CLIENT,this.transport=r,this.id="z9hG4bK"+Math.floor(1e7*Math.random()),this.request_sender=e,this.request=s,this.logger=e.ua.getLogger("sip.transaction.nict",this.id),n=t(e,r,this.id),this.request.setHeader("via",n),this.request_sender.ua.newTransaction(this)};s.prototype=Object.create(e.EventEmitter.prototype),s.prototype.stateChanged=function(e){this.state=e,this.emit("stateChanged")},s.prototype.send=function(){var t=this;this.stateChanged(i.STATUS_TRYING),this.F=e.Timers.setTimeout(t.timer_F.bind(t),e.Timers.TIMER_F),this.transport.send(this.request)||this.onTransportError()},s.prototype.onTransportError=function(){this.logger.log("transport error occurred, deleting non-INVITE client transaction "+this.id),e.Timers.clearTimeout(this.F),e.Timers.clearTimeout(this.K),this.stateChanged(i.STATUS_TERMINATED),this.request_sender.ua.destroyTransaction(this),this.request_sender.onTransportError()},s.prototype.timer_F=function(){this.logger.log("Timer F expired for non-INVITE client transaction "+this.id),this.stateChanged(i.STATUS_TERMINATED),this.request_sender.ua.destroyTransaction(this),this.request_sender.onRequestTimeout()},s.prototype.timer_K=function(){this.stateChanged(i.STATUS_TERMINATED),this.request_sender.ua.destroyTransaction(this)},s.prototype.receiveResponse=function(t){var s=this,r=t.status_code;if(r<200)switch(this.state){case i.STATUS_TRYING:case i.STATUS_PROCEEDING:this.stateChanged(i.STATUS_PROCEEDING),this.request_sender.receiveResponse(t)}else switch(this.state){case i.STATUS_TRYING:case i.STATUS_PROCEEDING:this.stateChanged(i.STATUS_COMPLETED),e.Timers.clearTimeout(this.F),408===r?this.request_sender.onRequestTimeout():this.request_sender.receiveResponse(t),this.K=e.Timers.setTimeout(s.timer_K.bind(s),e.Timers.TIMER_K)}};var r=function(e,s,r){var n,o=this;this.type=i.INVITE_CLIENT,this.transport=r,this.id="z9hG4bK"+Math.floor(1e7*Math.random()),this.request_sender=e,this.request=s,this.logger=e.ua.getLogger("sip.transaction.ict",this.id),n=t(e,r,this.id),this.request.setHeader("via",n),this.request_sender.ua.newTransaction(this),this.request.cancel=function(e,t){t=(t||[]).slice();for(var i=t.length,s=null,r=0;r/g,""):this.request.ruri;var r=new e.OutgoingRequest("ACK",i,this.request.ua,{cseq:this.response.cseq,call_id:this.response.call_id,from_uri:this.response.from.uri,from_tag:this.response.from_tag,to_uri:this.response.to.uri,to_tag:this.response.to_tag,route_set:this.response.getHeaders("record-route").reverse()},t.extraHeaders||[],t.body);return this.ackSender=new e.RequestSender({request:r,onRequestTimeout:this.request_sender.applicant.applicant?this.request_sender.applicant.applicant.onRequestTimeout:function(){s.logger.warn("ACK Request timed out")},onTransportError:this.request_sender.applicant.applicant?this.request_sender.applicant.applicant.onRequestTransportError:function(){s.loigger.warn("ACK Request had a transport error")},receiveResponse:t.receiveResponse||function(){s.logger.warn("Received a response to an ACK which was unexpected. Dropping Response.")}},this.request.ua).send(),r},r.prototype.cancel_request=function(t,s,r){var n=t.request;this.cancel=e.C.CANCEL+" "+n.ruri+" SIP/2.0\r\n",this.cancel+="Via: "+n.headers.Via.toString()+"\r\n",this.request.headers.Route&&(this.cancel+="Route: "+n.headers.Route.toString()+"\r\n"),this.cancel+="To: "+n.headers.To.toString()+"\r\n",this.cancel+="From: "+n.headers.From.toString()+"\r\n",this.cancel+="Call-ID: "+n.headers["Call-ID"].toString()+"\r\n",this.cancel+="CSeq: "+n.headers.CSeq.toString().split(" ")[0]+" CANCEL\r\n",s&&(this.cancel+="Reason: "+s+"\r\n"),r&&(this.cancel+=r),this.cancel+="Content-Length: 0\r\n\r\n",this.state===i.STATUS_PROCEEDING&&this.transport.send(this.cancel)},r.prototype.receiveResponse=function(t){var s=this,r=t.status_code;if(t.transaction=this,this.response&&this.response.status_code===t.status_code&&this.response.cseq===t.cseq)return this.logger.debug("ICT Received a retransmission for cseq: "+t.cseq),void(this.ackSender&&this.ackSender.send());if(this.response=t,r>=100&&r<=199)switch(this.state){case i.STATUS_CALLING:this.stateChanged(i.STATUS_PROCEEDING),this.request_sender.receiveResponse(t),this.cancel&&this.transport.send(this.cancel);break;case i.STATUS_PROCEEDING:this.request_sender.receiveResponse(t)}else if(r>=200&&r<=299)switch(this.state){case i.STATUS_CALLING:case i.STATUS_PROCEEDING:this.stateChanged(i.STATUS_ACCEPTED),this.M=e.Timers.setTimeout(s.timer_M.bind(s),e.Timers.TIMER_M),this.request_sender.receiveResponse(t);break;case i.STATUS_ACCEPTED:this.request_sender.receiveResponse(t)}else if(r>=300&&r<=699)switch(this.state){case i.STATUS_CALLING:case i.STATUS_PROCEEDING:this.stateChanged(i.STATUS_COMPLETED),this.sendACK(),this.request_sender.receiveResponse(t);break;case i.STATUS_COMPLETED:this.sendACK()}};var n=function(e,i,s){var r;this.transport=s,this.id="z9hG4bK"+Math.floor(1e7*Math.random()),this.request_sender=e,this.request=i,this.logger=e.ua.getLogger("sip.transaction.nict",this.id),r=t(e,s,this.id),this.request.setHeader("via",r)};n.prototype=Object.create(e.EventEmitter.prototype),n.prototype.send=function(){this.transport.send(this.request)||this.onTransportError()},n.prototype.onTransportError=function(){this.logger.log("transport error occurred, for an ACK client transaction "+this.id),this.request_sender.onTransportError()};var o=function(e,t){this.type=i.NON_INVITE_SERVER,this.id=e.via_branch,this.request=e,this.transport=e.transport,this.ua=t,this.last_response="",e.server_transaction=this,this.logger=t.getLogger("sip.transaction.nist",this.id),this.state=i.STATUS_TRYING,t.newTransaction(this)};o.prototype=Object.create(e.EventEmitter.prototype),o.prototype.stateChanged=function(e){this.state=e,this.emit("stateChanged")},o.prototype.timer_J=function(){this.logger.log("Timer J expired for non-INVITE server transaction "+this.id),this.stateChanged(i.STATUS_TERMINATED),this.ua.destroyTransaction(this)},o.prototype.onTransportError=function(){this.transportError||(this.transportError=!0,this.logger.log("transport error occurred, deleting non-INVITE server transaction "+this.id),e.Timers.clearTimeout(this.J),this.stateChanged(i.STATUS_TERMINATED),this.ua.destroyTransaction(this))},o.prototype.receiveResponse=function(t,s){var r=this,n=e.Utils.defer();if(100===t)switch(this.state){case i.STATUS_TRYING:this.stateChanged(i.STATUS_PROCEEDING),this.transport.send(s)||this.onTransportError();break;case i.STATUS_PROCEEDING:this.last_response=s,this.transport.send(s)?n.resolve():(this.onTransportError(),n.reject())}else if(t>=200&&t<=699)switch(this.state){case i.STATUS_TRYING:case i.STATUS_PROCEEDING:this.stateChanged(i.STATUS_COMPLETED),this.last_response=s,this.J=e.Timers.setTimeout(r.timer_J.bind(r),e.Timers.TIMER_J),this.transport.send(s)?n.resolve():(this.onTransportError(),n.reject())}return n.promise};var a=function(e,t){this.type=i.INVITE_SERVER,this.id=e.via_branch,this.request=e,this.transport=e.transport,this.ua=t,this.last_response="",e.server_transaction=this,this.logger=t.getLogger("sip.transaction.ist",this.id),this.state=i.STATUS_PROCEEDING,t.newTransaction(this),this.resendProvisionalTimer=null,e.reply(100)};a.prototype=Object.create(e.EventEmitter.prototype),a.prototype.stateChanged=function(e){this.state=e,this.emit("stateChanged")},a.prototype.timer_H=function(){this.logger.log("Timer H expired for INVITE server transaction "+this.id),this.state===i.STATUS_COMPLETED&&this.logger.warn("transactions","ACK for INVITE server transaction was never received, call will be terminated"),this.stateChanged(i.STATUS_TERMINATED),this.ua.destroyTransaction(this)},a.prototype.timer_I=function(){this.stateChanged(i.STATUS_TERMINATED),this.ua.destroyTransaction(this)},a.prototype.timer_L=function(){this.logger.log("Timer L expired for INVITE server transaction "+this.id),this.state===i.STATUS_ACCEPTED&&(this.stateChanged(i.STATUS_TERMINATED),this.ua.destroyTransaction(this))},a.prototype.onTransportError=function(){this.transportError||(this.transportError=!0,this.logger.log("transport error occurred, deleting INVITE server transaction "+this.id),null!==this.resendProvisionalTimer&&(e.Timers.clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null),e.Timers.clearTimeout(this.L),e.Timers.clearTimeout(this.H),e.Timers.clearTimeout(this.I),this.stateChanged(i.STATUS_TERMINATED),this.ua.destroyTransaction(this))},a.prototype.resend_provisional=function(){this.transport.send(this.last_response)||this.onTransportError()},a.prototype.receiveResponse=function(t,s){var r=this,n=e.Utils.defer();if(t>=100&&t<=199)switch(this.state){case i.STATUS_PROCEEDING:this.transport.send(s)||this.onTransportError(),this.last_response=s}if(t>100&&t<=199&&this.state===i.STATUS_PROCEEDING)null===this.resendProvisionalTimer&&(this.resendProvisionalTimer=e.Timers.setInterval(r.resend_provisional.bind(r),e.Timers.PROVISIONAL_RESPONSE_INTERVAL));else if(t>=200&&t<=299)switch(this.state){case i.STATUS_PROCEEDING:this.stateChanged(i.STATUS_ACCEPTED),this.last_response=s,this.L=e.Timers.setTimeout(r.timer_L.bind(r),e.Timers.TIMER_L),null!==this.resendProvisionalTimer&&(e.Timers.clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null);case i.STATUS_ACCEPTED:this.transport.send(s)?n.resolve():(this.onTransportError(),n.reject())}else if(t>=300&&t<=699)switch(this.state){case i.STATUS_PROCEEDING:null!==this.resendProvisionalTimer&&(e.Timers.clearInterval(this.resendProvisionalTimer),this.resendProvisionalTimer=null),this.transport.send(s)?(this.stateChanged(i.STATUS_COMPLETED),this.H=e.Timers.setTimeout(r.timer_H.bind(r),e.Timers.TIMER_H),n.resolve()):(this.onTransportError(),n.reject())}return n.promise};var c=function(t,s){var r;switch(s.method){case e.C.INVITE:if(r=t.transactions.ist[s.via_branch]){switch(r.state){case i.STATUS_PROCEEDING:r.transport.send(r.last_response)}return!0}break;case e.C.ACK:if(!(r=t.transactions.ist[s.via_branch]))return!1;if(r.state===i.STATUS_ACCEPTED)return!1;if(r.state===i.STATUS_COMPLETED)return r.stateChanged(i.STATUS_CONFIRMED),r.I=e.Timers.setTimeout(r.timer_I.bind(r),e.Timers.TIMER_I),!0;break;case e.C.CANCEL:return r=t.transactions.ist[s.via_branch],r?(s.reply_sl(200),r.state!==i.STATUS_PROCEEDING):(s.reply_sl(481),!0);default:if(r=t.transactions.nist[s.via_branch]){switch(r.state){case i.STATUS_TRYING:break;case i.STATUS_PROCEEDING:case i.STATUS_COMPLETED:r.transport.send(r.last_response)}return!0}}};e.Transactions={C:i,checkTransaction:c,NonInviteClientTransaction:s,InviteClientTransaction:r,AckClientTransaction:n,NonInviteServerTransaction:o,InviteServerTransaction:a}}},function(e,t,i){"use strict";e.exports=function(e){var t,s=i(17)(e),r={STATUS_EARLY:1,STATUS_CONFIRMED:2};t=function(t,i,s,n){var o;if(this.uac_pending_reply=!1,this.uas_pending_reply=!1,!i.hasHeader("contact"))return{error:"unable to create a Dialog without Contact header field"};n=i instanceof e.IncomingResponse?i.status_code<200?r.STATUS_EARLY:r.STATUS_CONFIRMED:n||r.STATUS_CONFIRMED,o=i.parseHeader("contact"),"UAS"===s?(this.id={call_id:i.call_id,local_tag:i.to_tag,remote_tag:i.from_tag,toString:function(){return this.call_id+this.local_tag+this.remote_tag}},this.state=n,this.remote_seqnum=i.cseq,this.local_uri=i.parseHeader("to").uri,this.remote_uri=i.parseHeader("from").uri,this.remote_target=o.uri,this.route_set=i.getHeaders("record-route"),this.invite_seqnum=i.cseq,this.local_seqnum=i.cseq):"UAC"===s&&(this.id={call_id:i.call_id,local_tag:i.from_tag,remote_tag:i.to_tag,toString:function(){return this.call_id+this.local_tag+this.remote_tag}},this.state=n,this.invite_seqnum=i.cseq,this.local_seqnum=i.cseq,this.local_uri=i.parseHeader("from").uri,this.pracked=[],this.remote_uri=i.parseHeader("to").uri,this.remote_target=o.uri,this.route_set=i.getHeaders("record-route").reverse()),this.logger=t.ua.getLogger("sip.dialog",this.id.toString()),this.owner=t,t.ua.dialogs[this.id.toString()]=this,this.logger.log("new "+s+" dialog created with status "+(this.state===r.STATUS_EARLY?"EARLY":"CONFIRMED")),t.emit("dialog",this)},t.prototype={update:function(e,t){this.state=r.STATUS_CONFIRMED,this.logger.log("dialog "+this.id.toString()+" changed to CONFIRMED state"),"UAC"===t&&(this.route_set=e.getHeaders("record-route").reverse())},terminate:function(){this.logger.log("dialog "+this.id.toString()+" deleted"),this.sessionDescriptionHandler&&this.state!==r.STATUS_CONFIRMED&&this.sessionDescriptionHandler.close(),delete this.owner.ua.dialogs[this.id.toString()]},createRequest:function(t,i,s){var r,n;return i=(i||[]).slice(),this.local_seqnum||(this.local_seqnum=Math.floor(1e4*Math.random())),r=t===e.C.CANCEL||t===e.C.ACK?this.invite_seqnum:this.local_seqnum+=1,n=new e.OutgoingRequest(t,this.remote_target,this.owner.ua,{cseq:r,call_id:this.id.call_id,from_uri:this.local_uri,from_tag:this.id.local_tag,to_uri:this.remote_uri,to_tag:this.id.remote_tag,route_set:this.route_set},i,s),n.dialog=this,n},checkInDialogRequest:function(t){var i=this;if(this.remote_seqnum){if(t.cseqthis.remote_seqnum){var s=1+(10*Math.random()|0);return t.reply(500,null,["Retry-After:"+s]),this.remote_seqnum=t.cseq,!1}this.uas_pending_reply=!0,t.server_transaction.on("stateChanged",function t(){this.state!==e.Transactions.C.STATUS_ACCEPTED&&this.state!==e.Transactions.C.STATUS_COMPLETED&&this.state!==e.Transactions.C.STATUS_TERMINATED||(this.removeListener("stateChanged",t),i.uas_pending_reply=!1)})}t.hasHeader("contact")&&t.server_transaction.on("stateChanged",function(){this.state===e.Transactions.C.STATUS_ACCEPTED&&(i.remote_target=t.parseHeader("contact").uri)});break;case e.C.NOTIFY:t.hasHeader("contact")&&t.server_transaction.on("stateChanged",function(){this.state===e.Transactions.C.STATUS_COMPLETED&&(i.remote_target=t.parseHeader("contact").uri)})}return t.cseq>this.remote_seqnum&&(this.remote_seqnum=t.cseq),!0},sendRequest:function(e,t,i){i=i||{};var r=(i.extraHeaders||[]).slice(),n=null;i.body&&(i.body.body?n=i.body:(n={},n.body=i.body,i.contentType&&(n.contentType=i.contentType)));var o=this.createRequest(t,r,n);return new s(this,e,o).send(),o},receiveRequest:function(e){this.checkInDialogRequest(e)&&this.owner.receiveRequest(e)}},t.C=r,e.Dialog=t}},function(e,t,i){"use strict";e.exports=function(e){var t;return t=function(e,t,i){this.dialog=e,this.applicant=t,this.request=i,this.reattempt=!1,this.reattemptTimer=null},t.prototype={send:function(){var t=this,i=new e.RequestSender(this,this.dialog.owner.ua);i.send(),this.request.method===e.C.INVITE&&i.clientTransaction.state!==e.Transactions.C.STATUS_TERMINATED&&(this.dialog.uac_pending_reply=!0,i.clientTransaction.on("stateChanged",function i(){this.state!==e.Transactions.C.STATUS_ACCEPTED&&this.state!==e.Transactions.C.STATUS_COMPLETED&&this.state!==e.Transactions.C.STATUS_TERMINATED||(this.removeListener("stateChanged",i),t.dialog.uac_pending_reply=!1)}))},onRequestTimeout:function(){this.applicant.onRequestTimeout()},onTransportError:function(){this.applicant.onTransportError()},receiveResponse:function(t){var i=this;408===t.status_code||481===t.status_code?this.applicant.onDialogError(t):t.method===e.C.INVITE&&491===t.status_code?this.reattempt?this.applicant.receiveResponse(t):(this.request.cseq.value=this.dialog.local_seqnum+=1,this.reattemptTimer=e.Timers.setTimeout(function(){i.applicant.owner.status!==e.Session.C.STATUS_TERMINATED&&(i.reattempt=!0,i.request_sender.send())},this.getReattemptTimeout())):this.applicant.receiveResponse(t)}},t}},function(e,t,i){"use strict";e.exports=function(e){var t;t=function(t,i){this.logger=i.getLogger("sip.requestsender"),this.ua=i,this.applicant=t,this.method=t.request.method,this.request=t.request,this.credentials=null,this.challenged=!1,this.staled=!1,i.status!==e.UA.C.STATUS_USER_CLOSED||this.method===e.C.BYE&&this.method===e.C.ACK||this.onTransportError()},t.prototype={send:function(){switch(this.method){case"INVITE":this.clientTransaction=new e.Transactions.InviteClientTransaction(this,this.request,this.ua.transport);break;case"ACK":this.clientTransaction=new e.Transactions.AckClientTransaction(this,this.request,this.ua.transport);break;default:this.clientTransaction=new e.Transactions.NonInviteClientTransaction(this,this.request,this.ua.transport)}return this.clientTransaction.send(),this.clientTransaction},onRequestTimeout:function(){this.applicant.onRequestTimeout()},onTransportError:function(){this.applicant.onTransportError()},receiveResponse:function(t){var i,s,r,n=t.status_code;if(401===n||407===n){if(401===t.status_code?(s=t.parseHeader("www-authenticate"),r="authorization"):(s=t.parseHeader("proxy-authenticate"),r="proxy-authorization"),!s)return this.logger.warn(t.status_code+" with wrong or missing challenge, cannot authenticate"),void this.applicant.receiveResponse(t);if(!this.challenged||!this.staled&&!0===s.stale){if(this.credentials||(this.credentials=this.ua.configuration.authenticationFactory(this.ua)),!this.credentials.authenticate(this.request,s))return void this.applicant.receiveResponse(t);this.challenged=!0,s.stale&&(this.staled=!0),t.method===e.C.REGISTER?i=this.applicant.cseq+=1:this.request.dialog?i=this.request.dialog.local_seqnum+=1:(i=this.request.cseq+1,this.request.cseq=i),this.request.setHeader("cseq",i+" "+this.method),this.request.setHeader(r,this.credentials.toString()),this.send()}else this.applicant.receiveResponse(t)}else this.applicant.receiveResponse(t)}},e.RequestSender=t}},function(e,t,i){"use strict";e.exports=function(e){var t;t=function(t){var i={};this.registrar=t.configuration.registrarServer,this.expires=t.configuration.registerExpires,this.contact=t.contact.toString(),this.contact+=";reg-id=1",this.contact+=';+sip.instance=""',this.call_id=e.Utils.createRandomToken(22),this.cseq=Math.floor(1e4*Math.random()),this.to_uri=t.configuration.uri,i.to_uri=this.to_uri,i.to_displayName=t.configuration.displayName,i.call_id=this.call_id,i.cseq=this.cseq,e.Utils.augment(this,e.ClientContext,[t,"REGISTER",this.registrar,{params:i}]),this.registrationTimer=null,this.registrationExpiredTimer=null,this.registered=!1,this.logger=t.getLogger("sip.registercontext")},t.prototype={register:function(t){var i,s=this;this.options=t||{},i=(this.options.extraHeaders||[]).slice(),i.push("Contact: "+this.contact+";expires="+this.expires),i.push("Allow: "+e.UA.C.ALLOWED_METHODS.toString()),this.closeHeaders=this.options.closeWithHeaders?(this.options.extraHeaders||[]).slice():[],this.receiveResponse=function(t){var i,r,n,o=t.getHeaders("contact").length;if(t.cseq===this.cseq)switch(null!==this.registrationTimer&&(e.Timers.clearTimeout(this.registrationTimer),this.registrationTimer=null),!0){case/^1[0-9]{2}$/.test(t.status_code):this.emit("progress",t);break;case/^2[0-9]{2}$/.test(t.status_code):if(this.emit("accepted",t),t.hasHeader("expires")&&(r=t.getHeader("expires")),null!==this.registrationExpiredTimer&&(e.Timers.clearTimeout(this.registrationExpiredTimer),this.registrationExpiredTimer=null),!o){this.logger.warn("no Contact header in response to REGISTER, response ignored");break}for(;o--;){if(i=t.parseHeader("contact",o),i.uri.user===this.ua.contact.uri.user){r=i.getParam("expires");break}i=null}if(!i){this.logger.warn("no Contact header pointing to us, response ignored");break}r||(r=this.expires),this.registrationTimer=e.Timers.setTimeout(function(){s.registrationTimer=null,s.register(s.options)},1e3*r-3e3),this.registrationExpiredTimer=e.Timers.setTimeout(function(){s.logger.warn("registration expired"),s.registered&&s.unregistered(null,e.C.causes.EXPIRES)},1e3*r),i.hasParam("temp-gruu")&&(this.ua.contact.temp_gruu=e.URI.parse(i.getParam("temp-gruu").replace(/"/g,""))),i.hasParam("pub-gruu")&&(this.ua.contact.pub_gruu=e.URI.parse(i.getParam("pub-gruu").replace(/"/g,""))),this.registered=!0,this.emit("registered",t||null);break;case/^423$/.test(t.status_code):t.hasHeader("min-expires")?(this.expires=t.getHeader("min-expires"),this.register(this.options)):(this.logger.warn("423 response received for REGISTER without Min-Expires"),this.registrationFailure(t,e.C.causes.SIP_FAILURE_CODE));break;default:n=e.Utils.sipErrorCause(t.status_code),this.registrationFailure(t,n)}},this.onRequestTimeout=function(){this.registrationFailure(null,e.C.causes.REQUEST_TIMEOUT)},this.onTransportError=function(){this.registrationFailure(null,e.C.causes.CONNECTION_ERROR)},this.cseq++,this.request.cseq=this.cseq,this.request.setHeader("cseq",this.cseq+" REGISTER"),this.request.extraHeaders=i,this.send()},registrationFailure:function(e,t){this.emit("failed",e||null,t||null)},onTransportClosed:function(){this.registered_before=this.registered,null!==this.registrationTimer&&(e.Timers.clearTimeout(this.registrationTimer),this.registrationTimer=null),null!==this.registrationExpiredTimer&&(e.Timers.clearTimeout(this.registrationExpiredTimer),this.registrationExpiredTimer=null),this.registered&&this.unregistered(null,e.C.causes.CONNECTION_ERROR)},onTransportConnected:function(){this.register(this.options)},close:function(){var e={all:!1,extraHeaders:this.closeHeaders};this.registered_before=this.registered,this.registered&&this.unregister(e)},unregister:function(t){var i;t=t||{},this.registered||t.all||this.logger.warn("Already unregistered, but sending an unregister anyways."),i=(t.extraHeaders||[]).slice(),this.registered=!1,null!==this.registrationTimer&&(e.Timers.clearTimeout(this.registrationTimer),this.registrationTimer=null),t.all?(i.push("Contact: *"),i.push("Expires: 0")):i.push("Contact: "+this.contact+";expires=0"),this.receiveResponse=function(t){var i;switch(!0){case/^1[0-9]{2}$/.test(t.status_code):this.emit("progress",t);break;case/^2[0-9]{2}$/.test(t.status_code):this.emit("accepted",t),null!==this.registrationExpiredTimer&&(e.Timers.clearTimeout(this.registrationExpiredTimer),this.registrationExpiredTimer=null),this.unregistered(t);break;default:i=e.Utils.sipErrorCause(t.status_code),this.unregistered(t,i)}},this.onRequestTimeout=function(){},this.onTransportError=function(){},this.cseq++,this.request.cseq=this.cseq,this.request.setHeader("cseq",this.cseq+" REGISTER"),this.request.extraHeaders=i,this.send()},unregistered:function(e,t){this.registered=!1,this.emit("unregistered",e||null,t||null)}},e.RegisterContext=t}},function(e,t,i){"use strict";e.exports=function(e){var t=function(e,t){};return t.prototype=Object.create(e.prototype,{close:{value:function(){}},getDescription:{value:function(e,t){}},hasDescription:{value:function(e){}},holdModifier:{value:function(e){}},setDescription:{value:function(e,t,i){}}}),t}},function(e,t,i){"use strict";e.exports=function(e){var t;t=function(t,i,s,r){var n=s;if(void 0===s)throw new TypeError("Not enough arguments");if(this.ua=t,this.logger=t.getLogger("sip.clientcontext"),this.method=i,!(s=t.normalizeTarget(s)))throw new TypeError("Invalid target: "+n);r=Object.create(r||Object.prototype),r.extraHeaders=(r.extraHeaders||[]).slice(),this.request=new e.OutgoingRequest(this.method,s,this.ua,r.params,r.extraHeaders),r.body&&(this.body={},this.body.body=r.body,r.contentType&&(this.body.contentType=r.contentType),this.request.body=this.body),this.localIdentity=this.request.from,this.remoteIdentity=this.request.to,this.data={}},t.prototype=Object.create(e.EventEmitter.prototype),t.prototype.send=function(){return new e.RequestSender(this,this.ua).send(),this},t.prototype.cancel=function(t){t=t||{},t.extraHeaders=(t.extraHeaders||[]).slice();var i=e.Utils.getCancelReason(t.status_code,t.reason_phrase);this.request.cancel(i,t.extraHeaders),this.emit("cancel")},t.prototype.receiveResponse=function(t){var i=e.Utils.getReasonPhrase(t.status_code);switch(!0){case/^1[0-9]{2}$/.test(t.status_code):this.emit("progress",t,i);break;case/^2[0-9]{2}$/.test(t.status_code):this.ua.applicants[this]&&delete this.ua.applicants[this],this.emit("accepted",t,i);break;default:this.ua.applicants[this]&&delete this.ua.applicants[this],this.emit("rejected",t,i),this.emit("failed",t,i)}},t.prototype.onRequestTimeout=function(){this.emit("failed",null,e.C.causes.REQUEST_TIMEOUT)},t.prototype.onTransportError=function(){this.emit("failed",null,e.C.causes.CONNECTION_ERROR)},e.ClientContext=t}},function(e,t,i){"use strict";e.exports=function(e){var t;t=function(t,i){this.ua=t,this.logger=t.getLogger("sip.servercontext"),this.request=i,i.method===e.C.INVITE?this.transaction=new e.Transactions.InviteServerTransaction(i,t):this.transaction=new e.Transactions.NonInviteServerTransaction(i,t),i.body&&(this.body=i.body),i.hasHeader("Content-Type")&&(this.contentType=i.getHeader("Content-Type")),this.method=i.method,this.data={},this.localIdentity=i.to,this.remoteIdentity=i.from},t.prototype=Object.create(e.EventEmitter.prototype),t.prototype.progress=function(e){return e=Object.create(e||Object.prototype),e.statusCode||(e.statusCode=180),e.minCode=100,e.maxCode=199,e.events=["progress"],this.reply(e)},t.prototype.accept=function(e){return e=Object.create(e||Object.prototype),e.statusCode||(e.statusCode=200),e.minCode=200,e.maxCode=299,e.events=["accepted"],this.reply(e)},t.prototype.reject=function(e){return e=Object.create(e||Object.prototype),e.statusCode||(e.statusCode=480),e.minCode=300,e.maxCode=699,e.events=["rejected","failed"],this.reply(e)},t.prototype.reply=function(t){t=t||{};var i,s=t.statusCode||100,r=t.minCode||100,n=t.maxCode||699,o=e.Utils.getReasonPhrase(s,t.reasonPhrase),a=t.extraHeaders||[],c=t.body,h=t.events||[];if(sn)throw new TypeError("Invalid statusCode: "+s);return i=this.request.reply(s,o,a,c),h.forEach(function(e){this.emit(e,i,o)},this),this},t.prototype.onRequestTimeout=function(){this.emit("failed",null,e.C.causes.REQUEST_TIMEOUT)},t.prototype.onTransportError=function(){this.emit("failed",null,e.C.causes.CONNECTION_ERROR)},e.ServerContext=t}},function(e,t,i){"use strict";e.exports=function(e,t){var s,r,n,o=i(24)(e),a={STATUS_NULL:0,STATUS_INVITE_SENT:1,STATUS_1XX_RECEIVED:2,STATUS_INVITE_RECEIVED:3,STATUS_WAITING_FOR_ANSWER:4,STATUS_ANSWERED:5,STATUS_WAITING_FOR_PRACK:6,STATUS_WAITING_FOR_ACK:7,STATUS_CANCELED:8,STATUS_TERMINATED:9,STATUS_ANSWERED_WAITING_FOR_PRACK:10,STATUS_EARLY_MEDIA:11,STATUS_CONFIRMED:12};s=function(t){if(this.status=a.STATUS_NULL,this.dialog=null,this.pendingReinvite=!1,this.earlyDialogs={},!t)throw new e.Exceptions.SessionDescriptionHandlerMissing("A session description handler is required for the session to function");this.sessionDescriptionHandlerFactory=t,this.hasOffer=!1,this.hasAnswer=!1,this.timers={ackTimer:null,expiresTimer:null,invite2xxTimer:null,userNoAnswerTimer:null,rel1xxTimer:null,prackTimer:null},this.startTime=null,this.endTime=null,this.tones=null,this.local_hold=!1,this.disableRenegotiation=!1,this.early_sdp=null,this.rel100=e.C.supported.UNSUPPORTED},s.prototype={dtmf:function(t,i){var s=[],r=this;if(i=i||{},void 0===t)throw new TypeError("Not enough arguments");if(this.status!==a.STATUS_CONFIRMED&&this.status!==a.STATUS_WAITING_FOR_ACK)throw new e.Exceptions.InvalidStateError(this.status);if("string"!=typeof t&&"number"!=typeof t||!t.toString().match(/^[0-9A-D#*,]+$/i))throw new TypeError("Invalid tones: "+t);for(t=t.toString().split("");t.length>0;)s.push(new o(this,t.shift(),i));if(this.tones)return this.tones=this.tones.concat(s),this;var n=function(){var t,s;if(r.status===a.STATUS_TERMINATED||!r.tones||0===r.tones.length)return r.tones=null,this;t=r.tones.shift(),t.on("failed",function(){r.tones=null}),t.send(i),s=t.duration+t.interToneGap,e.Timers.setTimeout(n,s)};return this.tones=s,n(),this},bye:function(t){t=Object.create(t||Object.prototype);var i=t.statusCode;if(this.status===a.STATUS_TERMINATED)return this.logger.error("Error: Attempted to send BYE in a terminated session."),this;if(this.logger.log("terminating Session"),i&&(i<200||i>=700))throw new TypeError("Invalid statusCode: "+i);return t.receiveResponse=function(){},this.sendRequest(e.C.BYE,t).terminated()},refer:function(t,i){i=i||{};var s=(i.extraHeaders||[]).slice(),r=t instanceof e.InviteServerContext||t instanceof e.InviteClientContext,n=t;if(void 0===t)throw new TypeError("Not enough arguments");if(this.status!==a.STATUS_CONFIRMED)throw new e.Exceptions.InvalidStateError(this.status);if(r)t='"'+t.remoteIdentity.friendlyName+'" <'+t.dialog.remote_target.toString()+"?Replaces="+t.dialog.id.call_id+"%3Bto-tag%3D"+t.dialog.id.remote_tag+"%3Bfrom-tag%3D"+t.dialog.id.local_tag+">";else{try{t=e.Grammar.parse(t,"Refer_To").uri||t}catch(e){this.logger.debug(".refer() cannot parse Refer_To from",t),this.logger.debug("...falling through to normalizeTarget()")}if(!(t=this.ua.normalizeTarget(t)))throw new TypeError("Invalid target: "+n)}return s.push("Contact: "+this.contact),s.push("Allow: "+e.UA.C.ALLOWED_METHODS.toString()),s.push("Refer-To: "+t),this.sendRequest(e.C.REFER,{extraHeaders:s,body:i.body,receiveResponse:function(e){/^2[0-9]{2}$/.test(e.status_code)&&(r||t.scheme&&t.scheme.match("^sips?$"))&&this.terminate()}.bind(this)}),this},followRefer:function(e){return function(e,i){var s=i.parseHeader("refer-to"),r=s.uri;if(!r.scheme.match("^sips?$")){var n=r.toString();return void("function"==typeof t.open?t.open(n):this.logger.warn("referred to non-SIP URI but `open` isn't in the environment: "+n))}var o=[],a=r.getHeader("Replaces");void 0!==a&&o.push("Replaces: "+decodeURIComponent(a)),r.clearHeaders();var c=this.passedOptions||{};c.params=c.params||{},c.params.to_displayName=s.friendlyName,c.extraHeaders=o,this.sessionDescriptionHandler&&(c.sessionDescriptionHandlerOptions=this.sessionDescriptionHandler.options);var h=this.ua.invite(r,c,this.modifiers);e.call(this,i,h),this.terminate()}.bind(this,e)},sendRequest:function(t,i){i=i||{};var s=this,r=new e.OutgoingRequest(t,this.dialog.remote_target,this.ua,{cseq:i.cseq||(this.dialog.local_seqnum+=1),call_id:this.dialog.id.call_id,from_uri:this.dialog.local_uri,from_tag:this.dialog.id.local_tag,to_uri:this.dialog.remote_uri,to_tag:this.dialog.id.remote_tag,route_set:this.dialog.route_set,statusCode:i.statusCode,reasonPhrase:i.reasonPhrase},i.extraHeaders||[],i.body);return new e.RequestSender({request:r,onRequestTimeout:function(){s.onRequestTimeout()},onTransportError:function(){s.onTransportError()},receiveResponse:i.receiveResponse||function(e){s.receiveNonInviteResponse(e)}},this.ua).send(),this.emit(t.toLowerCase(),r),this},close:function(){var t;if(this.status===a.STATUS_TERMINATED)return this;this.logger.log("closing INVITE session "+this.id),this.sessionDescriptionHandler&&this.sessionDescriptionHandler.close();for(t in this.timers)e.Timers.clearTimeout(this.timers[t]);this.dialog&&(this.dialog.terminate(),delete this.dialog);for(t in this.earlyDialogs)this.earlyDialogs[t].terminate(),delete this.earlyDialogs[t];return this.status=a.STATUS_TERMINATED,delete this.ua.sessions[this.id],this},createDialog:function(t,i,s){var r,n,o=t["UAS"===i?"to_tag":"from_tag"],a=t["UAS"===i?"from_tag":"to_tag"],c=t.call_id+o+a;if(n=this.earlyDialogs[c],s)return!!n||(n=new e.Dialog(this,t,i,e.Dialog.C.STATUS_EARLY),n.error?(this.logger.error(n.error),this.failed(t,e.C.causes.INTERNAL_ERROR),!1):(this.earlyDialogs[c]=n,!0));if(n){n.update(t,i),this.dialog=n,delete this.earlyDialogs[c];for(var h in this.earlyDialogs)this.earlyDialogs[h].terminate(),delete this.earlyDialogs[h];return!0}return r=new e.Dialog(this,t,i),r.error?(this.logger.error(r.error),this.failed(t,e.C.causes.INTERNAL_ERROR),!1):(this.to_tag=t.to_tag,this.dialog=r,!0)},hold:function(t,i){if(this.status!==a.STATUS_WAITING_FOR_ACK&&this.status!==a.STATUS_CONFIRMED)throw new e.Exceptions.InvalidStateError(this.status);if(this.local_hold)return void this.logger.log("Session is already on hold, cannot put it on hold again");t=t||{},t.modifiers=i||[],t.modifiers.push(this.sessionDescriptionHandler.holdModifier),this.local_hold=!0,this.sendReinvite(t)},unhold:function(t,i){if(this.status!==a.STATUS_WAITING_FOR_ACK&&this.status!==a.STATUS_CONFIRMED)throw new e.Exceptions.InvalidStateError(this.status);if(!this.local_hold)return void this.logger.log("Session is not on hold, cannot unhold it");t=t||{},i&&(t.modifiers=i),this.local_hold=!1,this.sendReinvite(t)},reinvite:function(e,t){return e=e||{},t&&(e.modifiers=t),this.sendReinvite(e)},receiveReinvite:function(t){var i=this;if(!this.sessionDescriptionHandler.hasDescription(t.getHeader("Content-Type")))return this.logger.warn("invalid Content-Type"),void t.reply(415);i.emit("reinvite",this),this.sessionDescriptionHandler.setDescription(t.body,this.sessionDescriptionHandlerOptions,this.modifiers).then(this.sessionDescriptionHandler.getDescription.bind(this.sessionDescriptionHandler,this.sessionDescriptionHandlerOptions,this.modifiers)).then(function(e){var s=["Contact: "+i.contact];t.reply(200,null,s,e,function(){i.status=a.STATUS_WAITING_FOR_ACK,i.setACKTimer(),i.emit("reinviteAccepted",i)})}).catch(function(s){var r;s instanceof e.Exceptions.GetDescriptionError?r=500:s instanceof e.Exceptions.RenegotiationError?(i.emit("renegotiationError",s),i.logger.warn(s),r=488):(i.logger.error(s),r=488),t.reply(r),i.emit("reinviteFailed",i)})},sendReinvite:function(t){if(this.pendingReinvite)return void this.logger.warn("Reinvite in progress. Please wait until complete, then try again.");this.pendingReinvite=!0,t=t||{},t.modifiers=t.modifiers||[];var i=this,s=(t.extraHeaders||[]).slice();s.push("Contact: "+this.contact),s.push("Allow: "+e.UA.C.ALLOWED_METHODS.toString()),this.sessionDescriptionHandler.getDescription(t.sessionDescriptionHandlerOptions,t.modifiers).then(function(t){i.sendRequest(e.C.INVITE,{extraHeaders:s,body:t,receiveResponse:i.receiveReinviteResponse.bind(i)})}).catch(function(t){if(t instanceof e.Exceptions.RenegotiationError)return i.pendingReinvite=!1,i.emit("renegotiationError",t),i.logger.warn("Renegotiation Error"),void i.logger.warn(t);i.logger.error("sessionDescriptionHandler error"),i.logger.error(t)})},receiveRequest:function(t){switch(t.method){case e.C.BYE:t.reply(200),this.status===a.STATUS_CONFIRMED&&(this.emit("bye",t),this.terminated(t,e.C.causes.BYE));break;case e.C.INVITE:this.status===a.STATUS_CONFIRMED&&(this.logger.log("re-INVITE received"),this.receiveReinvite(t));break;case e.C.INFO:if(this.status===a.STATUS_CONFIRMED||this.status===a.STATUS_WAITING_FOR_ACK){if(this.onInfo)return this.onInfo(t);var i,s,r,n=t.getHeader("content-type"),c=/^(Signal\s*?=\s*?)([0-9A-D#*]{1})(\s)?.*/,h=/^(Duration\s?=\s?)([0-9]{1,4})(\s)?.*/;n&&(n.match(/^application\/dtmf-relay/i)?(t.body&&(i=t.body.split("\r\n",2),2===i.length&&(c.test(i[0])&&(s=i[0].replace(c,"$2")),h.test(i[1])&&(r=parseInt(i[1].replace(h,"$2"),10)))),new o(this,s,{duration:r}).init_incoming(t)):t.reply(415,null,["Accept: application/dtmf-relay"]))}break;case e.C.REFER:if(this.status===a.STATUS_CONFIRMED){this.logger.log("REFER received");var u,l=this.listeners("refer").length;l?(t.reply(202,"Accepted"),u="SIP/2.0 100 Trying",this.sendRequest(e.C.NOTIFY,{extraHeaders:["Event: refer","Subscription-State: terminated","Content-Type: message/sipfrag"],body:u,receiveResponse:function(){}}),this.emit("refer",t)):t.reply(603,"Declined")}break;case e.C.NOTIFY:t.reply(200,"OK"),this.emit("notify",t)}},receiveReinviteResponse:function(t){var i=this;if(this.status!==a.STATUS_TERMINATED)switch(!0){case/^1[0-9]{2}$/.test(t.status_code):break;case/^2[0-9]{2}$/.test(t.status_code):if(this.status=a.STATUS_CONFIRMED,this.emit("ack",t.transaction.sendACK()),this.pendingReinvite=!1,e.Timers.clearTimeout(i.timers.invite2xxTimer),!this.sessionDescriptionHandler.hasDescription(t.getHeader("Content-Type"))){this.logger.error("2XX response received to re-invite but did not have a description"),this.emit("renegotiationError",new e.Exceptions.RenegotiationError("2XX response received to re-invite but did not have a description"));break}this.sessionDescriptionHandler.setDescription(t.body,this.sessionDescriptionHandlerOptions,this.modifiers).catch(function(t){i.logger.error("Could not set the description in 2XX response"),i.logger.error(t),i.emit("renegotiationError",t),i.sendRequest(e.C.BYE,{extraHeaders:[e.Utils.getReasonHeaderValue(488,"Not Acceptable Here")]})});break;default:this.disableRenegotiation=!0,this.pendingReinvite=!1,this.logger.log("Received a non 1XX or 2XX response to a re-invite"),this.emit("renegotiationError",new e.Exceptions.RenegotiationError("Invalid response to a re-invite"))}},acceptAndTerminate:function(t,i,s){var r=[];return i&&r.push("Reason: "+e.Utils.getReasonHeaderValue(i,s)),(this.dialog||this.createDialog(t,"UAC"))&&(this.emit("ack",t.transaction.sendACK()),this.sendRequest(e.C.BYE,{extraHeaders:r})),this},setInvite2xxTimer:function(t,i){var s=this,r=e.Timers.T1;this.timers.invite2xxTimer=e.Timers.setTimeout(function n(){if(s.status===a.STATUS_WAITING_FOR_ACK){s.logger.log("no ACK received, attempting to retransmit OK");var o=["Contact: "+s.contact];t.reply(200,null,o,i),r=Math.min(2*r,e.Timers.T2),s.timers.invite2xxTimer=e.Timers.setTimeout(n,r)}},r)},setACKTimer:function(){var t=this;this.timers.ackTimer=e.Timers.setTimeout(function(){t.status===a.STATUS_WAITING_FOR_ACK&&(t.logger.log("no ACK received for an extended period of time, terminating the call"),e.Timers.clearTimeout(t.timers.invite2xxTimer),t.sendRequest(e.C.BYE),t.terminated(null,e.C.causes.NO_ACK))},e.Timers.TIMER_H)},onTransportError:function(){this.status!==a.STATUS_CONFIRMED&&this.status!==a.STATUS_TERMINATED&&this.failed(null,e.C.causes.CONNECTION_ERROR)},onRequestTimeout:function(){this.status===a.STATUS_CONFIRMED?this.terminated(null,e.C.causes.REQUEST_TIMEOUT):this.status!==a.STATUS_TERMINATED&&(this.failed(null,e.C.causes.REQUEST_TIMEOUT),this.terminated(null,e.C.causes.REQUEST_TIMEOUT))},onDialogError:function(t){this.status===a.STATUS_CONFIRMED?this.terminated(t,e.C.causes.DIALOG_ERROR):this.status!==a.STATUS_TERMINATED&&(this.failed(t,e.C.causes.DIALOG_ERROR),this.terminated(t,e.C.causes.DIALOG_ERROR))},failed:function(e,t){return this.status===a.STATUS_TERMINATED?this:(this.emit("failed",e||null,t||null),this)},rejected:function(e,t){return this.emit("rejected",e||null,t||null),this},canceled:function(){return this.emit("cancel"),this},accepted:function(t,i){return i=e.Utils.getReasonPhrase(t&&t.status_code,i),this.startTime=new Date,this.replacee&&(this.replacee.emit("replaced",this),this.replacee.terminate()),this.emit("accepted",t,i),this},terminated:function(e,t){return this.status===a.STATUS_TERMINATED?this:(this.endTime=new Date,this.close(),this.emit("terminated",e||null,t||null),this)},connecting:function(e){return this.emit("connecting",{request:e}),this}},s.C=a,e.Session=s,r=function(t,i){function s(e,t){i.hasHeader(e)&&i.getHeader(e).toLowerCase().indexOf("100rel")>=0&&(n.rel100=t)}var r,n=this,o=i.getHeader("Content-Type"),c=i.parseHeader("Content-Disposition");if(e.Utils.augment(this,e.ServerContext,[t,i]),e.Utils.augment(this,e.Session,[t.configuration.sessionDescriptionHandlerFactory]),c&&"render"===c.type&&(this.renderbody=i.body,this.rendertype=o),this.status=a.STATUS_INVITE_RECEIVED,this.from_tag=i.from_tag,this.id=i.call_id+this.from_tag,this.request=i,this.contact=this.ua.contact.toString(),this.receiveNonInviteResponse=function(){},this.logger=t.getLogger("sip.inviteservercontext",this.id),this.ua.sessions[this.id]=this,i.hasHeader("expires")&&(r=1e3*i.getHeader("expires")),s("require",e.C.supported.REQUIRED),s("supported",e.C.supported.SUPPORTED),i.to_tag=e.Utils.newTag(),!this.createDialog(i,"UAS",!0))return void i.reply(500,"Missing Contact header field");var h={extraHeaders:["Contact: "+n.contact]};n.rel100!==e.C.supported.REQUIRED&&n.progress(h),n.status=a.STATUS_WAITING_FOR_ANSWER,n.timers.userNoAnswerTimer=e.Timers.setTimeout(function(){i.reply(408),n.failed(i,e.C.causes.NO_ANSWER),n.terminated(i,e.C.causes.NO_ANSWER)},n.ua.configuration.noAnswerTimeout),r&&(n.timers.expiresTimer=e.Timers.setTimeout(function(){n.status===a.STATUS_WAITING_FOR_ANSWER&&(i.reply(487),n.failed(i,e.C.causes.EXPIRES),n.terminated(i,e.C.causes.EXPIRES))},r))},r.prototype={reject:function(t){if(this.status===a.STATUS_TERMINATED)throw new e.Exceptions.InvalidStateError(this.status);return this.logger.log("rejecting RTCSession"),e.ServerContext.prototype.reject.call(this,t),this.terminated()},terminate:function(t){t=t||{};var i,s=(t.extraHeaders||[]).slice(),r=t.body,n=this;return this.status===a.STATUS_WAITING_FOR_ACK&&this.request.server_transaction.state!==e.Transactions.C.STATUS_TERMINATED?(i=this.dialog,this.receiveRequest=function(t){t.method===e.C.ACK&&(this.sendRequest(e.C.BYE,{extraHeaders:s,body:r}),i.terminate())},this.request.server_transaction.on("stateChanged",function(){this.state===e.Transactions.C.STATUS_TERMINATED&&this.dialog&&(this.request=new e.OutgoingRequest(e.C.BYE,this.dialog.remote_target,this.ua,{cseq:this.dialog.local_seqnum+=1,call_id:this.dialog.id.call_id,from_uri:this.dialog.local_uri,from_tag:this.dialog.id.local_tag,to_uri:this.dialog.remote_uri,to_tag:this.dialog.id.remote_tag,route_set:this.dialog.route_set},s,r),new e.RequestSender({request:this.request,onRequestTimeout:function(){n.onRequestTimeout()},onTransportError:function(){n.onTransportError()},receiveResponse:function(){}},this.ua).send(),i.terminate())}),this.emit("bye",this.request),this.terminated(),this.dialog=i,this.ua.dialogs[i.id.toString()]=i):this.status===a.STATUS_CONFIRMED?this.bye(t):this.reject(t),this},progress:function(t){function i(){n=t.statusCode||183,this.status=a.STATUS_WAITING_FOR_PRACK,c.push("Contact: "+this.contact),c.push("Require: 100rel"),c.push("RSeq: "+Math.floor(1e4*Math.random())),this.sessionDescriptionHandler.getDescription(t.sessionDescriptionHandlerOptions,t.modifiers).then(function(t){if(!this.isCanceled&&this.status!==a.STATUS_TERMINATED){this.early_sdp=t.body,this[this.hasOffer?"hasAnswer":"hasOffer"]=!0;var i=e.Timers.T1;this.timers.rel1xxTimer=e.Timers.setTimeout(function s(){this.request.reply(n,null,c,t),i*=2,this.timers.rel1xxTimer=e.Timers.setTimeout(s.bind(this),i)}.bind(this),i),this.timers.prackTimer=e.Timers.setTimeout(function(){this.status===a.STATUS_WAITING_FOR_PRACK&&(this.logger.log("no PRACK received, rejecting the call"),e.Timers.clearTimeout(this.timers.rel1xxTimer),this.request.reply(504),this.terminated(null,e.C.causes.NO_PRACK))}.bind(this),64*e.Timers.T1),r=this.request.reply(n,o,c,t),this.emit("progress",r,o)}}.bind(this),function(){this.request.reply(480),this.failed(null,e.C.causes.WEBRTC_ERROR),this.terminated(null,e.C.causes.WEBRTC_ERROR)}.bind(this))}function s(){r=this.request.reply(n,o,c,h),this.emit("progress",r,o)}t=t||{};var r,n=t.statusCode||180,o=t.reasonPhrase,c=(t.extraHeaders||[]).slice(),h=t.body;if(n<100||n>199)throw new TypeError("Invalid statusCode: "+n);return this.isCanceled||this.status===a.STATUS_TERMINATED?this:(100!==t.statusCode&&(this.rel100===e.C.supported.REQUIRED||this.rel100===e.C.supported.SUPPORTED&&t.rel100||this.rel100===e.C.supported.SUPPORTED&&this.ua.configuration.rel100===e.C.supported.REQUIRED)?(this.sessionDescriptionHandler=this.setupSessionDescriptionHandler(),this.sessionDescriptionHandler.hasDescription(this.request.getHeader("Content-Type"))?(this.hasOffer=!0,this.sessionDescriptionHandler.setDescription(this.request.body,t.sessionDescriptionHandlerOptions,t.modifiers).then(i.apply(this)).catch(function(t){this.logger.warn("invalid description"),this.logger.warn(t),this.failed(null,e.C.causes.WEBRTC_ERROR),this.terminated(null,e.C.causes.WEBRTC_ERROR)}.bind(this))):i.apply(this)):s.apply(this),this)},accept:function(t){t=t||{},this.onInfo=t.onInfo;var i=this,s=this.request,r=(t.extraHeaders||[]).slice(),n=function(t){var n,o=function(){i.status=a.STATUS_WAITING_FOR_ACK,i.setInvite2xxTimer(s,t),i.setACKTimer()},c=function(){i.failed(null,e.C.causes.CONNECTION_ERROR),i.terminated(null,e.C.causes.CONNECTION_ERROR)};r.push("Contact: "+i.contact),r.push("Allow: "+e.UA.C.ALLOWED_METHODS.toString()),i.hasOffer?i.hasAnswer=!0:i.hasOffer=!0,n=s.reply(200,null,r,t,o,c),i.status!==a.STATUS_TERMINATED&&i.accepted(n,e.Utils.getReasonPhrase(200))},o=function(){i.status!==a.STATUS_TERMINATED&&(i.request.reply(480),i.failed(null,e.C.causes.WEBRTC_ERROR),i.terminated(null,e.C.causes.WEBRTC_ERROR))};if(this.status===a.STATUS_WAITING_FOR_PRACK)return this.status=a.STATUS_ANSWERED_WAITING_FOR_PRACK,this;if(this.status===a.STATUS_WAITING_FOR_ANSWER)this.status=a.STATUS_ANSWERED;else if(this.status!==a.STATUS_EARLY_MEDIA)throw new e.Exceptions.InvalidStateError(this.status);if(!this.createDialog(s,"UAS"))return s.reply(500,"Missing Contact header field"),this;if(e.Timers.clearTimeout(this.timers.userNoAnswerTimer),this.status===a.STATUS_EARLY_MEDIA)n({});else if(this.sessionDescriptionHandler=this.setupSessionDescriptionHandler(),"0"!==this.request.getHeader("Content-Length")||this.request.getHeader("Content-Type")){if(!this.sessionDescriptionHandler.hasDescription(this.request.getHeader("Content-Type")))return void this.request.reply(415);this.hasOffer=!0,this.sessionDescriptionHandler.setDescription(this.request.body,t.sessionDescriptionHandlerOptions,t.modifiers).then(function(){return this.sessionDescriptionHandler.getDescription(t.sessionDescriptionHandlerOptions,t.modifiers)}.bind(this)).then(n).catch(o)}else this.sessionDescriptionHandler.getDescription(t.sessionDescriptionHandlerOptions,t.modifiers).then(n).catch(o);return this},receiveRequest:function(t){function i(){var i,s;e.Timers.clearTimeout(this.timers.ackTimer),e.Timers.clearTimeout(this.timers.invite2xxTimer),this.status=a.STATUS_CONFIRMED,i=t.getHeader("Content-Type"),s=t.getHeader("Content-Disposition"),s&&"render"===s.type&&(this.renderbody=t.body,this.rendertype=i),this.emit("confirmed",t)}switch(t.method){case e.C.CANCEL:this.status!==a.STATUS_WAITING_FOR_ANSWER&&this.status!==a.STATUS_WAITING_FOR_PRACK&&this.status!==a.STATUS_ANSWERED_WAITING_FOR_PRACK&&this.status!==a.STATUS_EARLY_MEDIA&&this.status!==a.STATUS_ANSWERED||(this.status=a.STATUS_CANCELED,this.request.reply(487),this.canceled(t),this.rejected(t,e.C.causes.CANCELED),this.failed(t,e.C.causes.CANCELED),this.terminated(t,e.C.causes.CANCELED));break;case e.C.ACK:this.status===a.STATUS_WAITING_FOR_ACK&&(this.hasAnswer?i.apply(this):(this.sessionDescriptionHandler=this.setupSessionDescriptionHandler(),this.sessionDescriptionHandler.hasDescription(t.getHeader("Content-Type"))?(this.hasAnswer=!0,this.sessionDescriptionHandler.setDescription(t.body,this.sessionDescriptionHandlerOptions,this.modifiers).then(i.bind(this),function(i){this.logger.warn(i),this.terminate({statusCode:"488",reasonPhrase:"Bad Media Description"}),this.failed(t,e.C.causes.BAD_MEDIA_DESCRIPTION),this.terminated(t,e.C.causes.BAD_MEDIA_DESCRIPTION)}.bind(this))):this.early_sdp?i.apply(this):(this.failed(t,e.C.causes.BAD_MEDIA_DESCRIPTION),this.terminated(t,e.C.causes.BAD_MEDIA_DESCRIPTION))));break;case e.C.PRACK:this.status===a.STATUS_WAITING_FOR_PRACK||this.status===a.STATUS_ANSWERED_WAITING_FOR_PRACK?this.hasAnswer?(e.Timers.clearTimeout(this.timers.rel1xxTimer),e.Timers.clearTimeout(this.timers.prackTimer),t.reply(200),this.status===a.STATUS_ANSWERED_WAITING_FOR_PRACK&&(this.status=a.STATUS_EARLY_MEDIA,this.accept()),this.status=a.STATUS_EARLY_MEDIA):(this.sessionDescriptionHandler=this.setupSessionDescriptionHandler(),this.sessionDescriptionHandler.hasDescription(t.getHeader("Content-Type"))?(this.hasAnswer=!0,this.sessionDescriptionHandler.setDescription(t.body,this.sessionDescriptionHandlerOptions,this.modifiers).then(function(){e.Timers.clearTimeout(this.timers.rel1xxTimer),e.Timers.clearTimeout(this.timers.prackTimer),t.reply(200),this.status===a.STATUS_ANSWERED_WAITING_FOR_PRACK&&(this.status=a.STATUS_EARLY_MEDIA,this.accept()),this.status=a.STATUS_EARLY_MEDIA}.bind(this),function(i){this.logger.warn(i),this.terminate({statusCode:"488",reasonPhrase:"Bad Media Description"}),this.failed(t,e.C.causes.BAD_MEDIA_DESCRIPTION),this.terminated(t,e.C.causes.BAD_MEDIA_DESCRIPTION)}.bind(this))):(this.terminate({statusCode:"488",reasonPhrase:"Bad Media Description"}),this.failed(t,e.C.causes.BAD_MEDIA_DESCRIPTION),this.terminated(t,e.C.causes.BAD_MEDIA_DESCRIPTION))):this.status===a.STATUS_EARLY_MEDIA&&t.reply(200);break;default:s.prototype.receiveRequest.apply(this,[t])}},setupSessionDescriptionHandler:function(){return this.sessionDescriptionHandler?this.sessionDescriptionHandler:this.sessionDescriptionHandlerFactory(this,this.ua.configuration.sessionDescriptionHandlerFactoryOptions)},onTransportError:function(){this.status!==a.STATUS_CONFIRMED&&this.status!==a.STATUS_TERMINATED&&this.failed(null,e.C.causes.CONNECTION_ERROR)},onRequestTimeout:function(){this.status===a.STATUS_CONFIRMED?this.terminated(null,e.C.causes.REQUEST_TIMEOUT):this.status!==a.STATUS_TERMINATED&&(this.failed(null,e.C.causes.REQUEST_TIMEOUT),this.terminated(null,e.C.causes.REQUEST_TIMEOUT))}},e.InviteServerContext=r,n=function(t,i,s,r){s=s||{},this.passedOptions=s,s.params=Object.create(s.params||Object.prototype);var n=(s.extraHeaders||[]).slice(),o=t.configuration.sessionDescriptionHandlerFactory;if(this.sessionDescriptionHandlerFactoryOptions=t.configuration.sessionDescriptionHandlerFactoryOptions||{},this.sessionDescriptionHandlerOptions=s.sessionDescriptionHandlerOptions||{},this.modifiers=r,this.inviteWithoutSdp=s.inviteWithoutSdp||!1,this.anonymous=s.anonymous||!1,this.renderbody=s.renderbody||null,this.rendertype=s.rendertype||"text/plain",this.from_tag=e.Utils.newTag(),s.params.from_tag=this.from_tag,this.contact=t.contact.toString({anonymous:this.anonymous,outbound:this.anonymous?!t.contact.temp_gruu:!t.contact.pub_gruu}),this.anonymous&&(s.params.from_displayName="Anonymous",s.params.from_uri="sip:anonymous@anonymous.invalid",n.push("P-Preferred-Identity: "+t.configuration.uri.toString()),n.push("Privacy: id")),n.push("Contact: "+this.contact),n.push("Allow: "+e.UA.C.ALLOWED_METHODS.toString()),this.inviteWithoutSdp&&this.renderbody&&(n.push("Content-Type: "+this.rendertype),n.push("Content-Disposition: render;handling=optional")),t.configuration.rel100===e.C.supported.REQUIRED&&n.push("Require: 100rel"),t.configuration.replaces===e.C.supported.REQUIRED&&n.push("Require: replaces"),s.extraHeaders=n,e.Utils.augment(this,e.ClientContext,[t,e.C.INVITE,i,s]),e.Utils.augment(this,e.Session,[o]),this.status!==a.STATUS_NULL)throw new e.Exceptions.InvalidStateError(this.status);this.isCanceled=!1,this.received_100=!1,this.method=e.C.INVITE,this.receiveNonInviteResponse=this.receiveResponse,this.receiveResponse=this.receiveInviteResponse,this.logger=t.getLogger("sip.inviteclientcontext"),t.applicants[this]=this,this.id=this.request.call_id+this.from_tag,this.onInfo=s.onInfo},n.prototype={invite:function(){var t=this;return this.ua.sessions[this.id]=this,this.inviteWithoutSdp?(this.request.body=t.renderbody,this.status=a.STATUS_INVITE_SENT,this.send()):(this.sessionDescriptionHandler=this.sessionDescriptionHandlerFactory(this,this.sessionDescriptionHandlerFactoryOptions),this.sessionDescriptionHandler.getDescription(this.sessionDescriptionHandlerOptions,this.modifiers).then(function(e){t.isCanceled||t.status===a.STATUS_TERMINATED||(t.hasOffer=!0,t.request.body=e,t.status=a.STATUS_INVITE_SENT,t.send())},function(){t.status!==a.STATUS_TERMINATED&&(t.failed(null,e.C.causes.WEBRTC_ERROR),t.terminated(null,e.C.causes.WEBRTC_ERROR))})),this},receiveInviteResponse:function(t){var i,s=this,r=t.call_id+t.from_tag+t.to_tag,n=[],o={};if(this.status!==a.STATUS_TERMINATED&&t.method===e.C.INVITE){if(this.dialog&&t.status_code>=200&&t.status_code<=299){if(r!==this.dialog.id.toString()){if(!this.createDialog(t,"UAC",!0))return;return this.emit("ack",t.transaction.sendACK({body:e.Utils.generateFakeSDP(t.body)})),this.earlyDialogs[r].sendRequest(this,e.C.BYE),void(this.status!==a.STATUS_CONFIRMED&&(this.failed(t,e.C.causes.WEBRTC_ERROR),this.terminated(t,e.C.causes.WEBRTC_ERROR)))}if(this.status===a.STATUS_CONFIRMED)return void this.emit("ack",t.transaction.sendACK());if(!this.hasAnswer)return}if(this.dialog&&t.status_code<200){if(-1!==this.dialog.pracked.indexOf(t.getHeader("rseq"))||this.dialog.pracked[this.dialog.pracked.length-1]>=t.getHeader("rseq")&&this.dialog.pracked.length>0)return;if(!this.earlyDialogs[r]&&!this.createDialog(t,"UAC",!0))return;if(-1!==this.earlyDialogs[r].pracked.indexOf(t.getHeader("rseq"))||this.earlyDialogs[r].pracked[this.earlyDialogs[r].pracked.length-1]>=t.getHeader("rseq")&&this.earlyDialogs[r].pracked.length>0)return;return n.push("RAck: "+t.getHeader("rseq")+" "+t.getHeader("cseq")),this.earlyDialogs[r].pracked.push(t.getHeader("rseq")),void this.earlyDialogs[r].sendRequest(this,e.C.PRACK,{extraHeaders:n,body:e.Utils.generateFakeSDP(t.body)})}if(this.isCanceled)return void(t.status_code>=100&&t.status_code<200?(this.request.cancel(this.cancelReason,n),this.canceled(null)):t.status_code>=200&&t.status_code<299?(this.acceptAndTerminate(t),this.emit("bye",this.request)):t.status_code>=300&&(i=e.C.REASON_PHRASE[t.status_code]||e.C.causes.CANCELED,this.rejected(t,i),this.failed(t,i),this.terminated(t,i)));switch(!0){case/^100$/.test(t.status_code):this.received_100=!0,this.emit("progress",t);break;case/^1[0-9]{2}$/.test(t.status_code):if(!t.to_tag){this.logger.warn("1xx response received without to tag");break}if(t.hasHeader("contact")&&!this.createDialog(t,"UAC",!0))break;if(this.status=a.STATUS_1XX_RECEIVED,t.hasHeader("require")&&-1!==t.getHeader("require").indexOf("100rel")){if(this.dialog||!this.earlyDialogs[r])break;if(-1!==this.earlyDialogs[r].pracked.indexOf(t.getHeader("rseq"))||this.earlyDialogs[r].pracked[this.earlyDialogs[r].pracked.length-1]>=t.getHeader("rseq")&&this.earlyDialogs[r].pracked.length>0)return;if(this.sessionDescriptionHandler=this.sessionDescriptionHandlerFactory(this,this.sessionDescriptionHandlerFactoryOptions),this.sessionDescriptionHandler.hasDescription(t.getHeader("Content-Type")))if(this.hasOffer){if(!this.createDialog(t,"UAC"))break;this.hasAnswer=!0,this.dialog.pracked.push(t.getHeader("rseq")),this.sessionDescriptionHandler.setDescription(t.body,this.sessionDescriptionHandlerOptions,this.modifiers).then(function(){n.push("RAck: "+t.getHeader("rseq")+" "+t.getHeader("cseq")),s.sendRequest(e.C.PRACK,{extraHeaders:n,receiveResponse:function(){}}),s.status=a.STATUS_EARLY_MEDIA,s.emit("progress",t)},function(i){s.logger.warn(i),s.acceptAndTerminate(t,488,"Not Acceptable Here"),s.failed(t,e.C.causes.BAD_MEDIA_DESCRIPTION)})}else{var c=this.earlyDialogs[r],h=c.sessionDescriptionHandler=this.sessionDescriptionHandlerFactory(this,this.sessionDescriptionHandlerOptions);c.pracked.push(t.getHeader("rseq")),h.setDescription(t.body,s.sessionDescriptionHandlerOptions,s.modifers).then(h.getDescription.bind(h,s.sessionDescriptionHandlerOptions,s.modifiers)).then(function(i){n.push("RAck: "+t.getHeader("rseq")+" "+t.getHeader("cseq")),c.sendRequest(s,e.C.PRACK,{extraHeaders:n,body:i}),s.status=a.STATUS_EARLY_MEDIA,s.emit("progress",t)}).catch(function(i){if(i instanceof e.Exceptions.GetDescriptionError){if(c.pracked.push(t.getHeader("rseq")),s.status===a.STATUS_TERMINATED)return;s.failed(null,e.C.causes.WEBRTC_ERROR),s.terminated(null,e.C.causes.WEBRTC_ERROR)}else c.pracked.splice(c.pracked.indexOf(t.getHeader("rseq")),1),s.logger.warn("invalid description"),s.logger.warn(i)})}else n.push("RAck: "+t.getHeader("rseq")+" "+t.getHeader("cseq")),this.earlyDialogs[r].pracked.push(t.getHeader("rseq")),this.earlyDialogs[r].sendRequest(this,e.C.PRACK,{extraHeaders:n}),this.emit("progress",t)}else this.emit("progress",t);break;case/^2[0-9]{2}$/.test(t.status_code):if(this.request.cseq+" "+this.request.method!==t.getHeader("cseq"))break;if(this.status===a.STATUS_EARLY_MEDIA&&this.dialog){this.status=a.STATUS_CONFIRMED,o={},this.renderbody&&(n.push("Content-Type: "+this.rendertype),o.extraHeaders=n,o.body=this.renderbody),this.emit("ack",t.transaction.sendACK(o)),this.accepted(t);break}if(this.dialog)break;if(this.hasOffer)if(this.hasAnswer)this.renderbody&&(n.push("Content-Type: "+s.rendertype),o.extraHeaders=n,o.body=this.renderbody),this.emit("ack",t.transaction.sendACK(o));else{if(!this.sessionDescriptionHandler.hasDescription(t.getHeader("Content-Type"))){this.acceptAndTerminate(t,400,"Missing session description"),this.failed(t,e.C.causes.BAD_MEDIA_DESCRIPTION);break}if(!this.createDialog(t,"UAC"))break;this.hasAnswer=!0,this.sessionDescriptionHandler.setDescription(t.body,this.sessionDescriptionHandlerOptions,this.modifiers).then(function(){var e={};s.status=a.STATUS_CONFIRMED,s.renderbody&&(n.push("Content-Type: "+s.rendertype),e.extraHeaders=n,e.body=s.renderbody),s.emit("ack",t.transaction.sendACK(e)),s.accepted(t)},function(i){s.logger.warn(i),s.acceptAndTerminate(t,488,"Not Acceptable Here"),s.failed(t,e.C.causes.BAD_MEDIA_DESCRIPTION)})}else if(this.earlyDialogs[r]&&this.earlyDialogs[r].sessionDescriptionHandler){if(this.hasOffer=!0,this.hasAnswer=!0,this.sessionDescriptionHandler=this.earlyDialogs[r].sessionDescriptionHandler,!this.createDialog(t,"UAC"))break;this.status=a.STATUS_CONFIRMED,this.emit("ack",t.transaction.sendACK()),this.accepted(t)}else{if(this.sessionDescriptionHandler=this.sessionDescriptionHandlerFactory(this,this.sessionDescriptionHandlerFactoryOptions),!this.sessionDescriptionHandler.hasDescription(t.getHeader("Content-Type"))){this.acceptAndTerminate(t,400,"Missing session description"),this.failed(t,e.C.causes.BAD_MEDIA_DESCRIPTION);break}if(!this.createDialog(t,"UAC"))break;this.hasOffer=!0,this.sessionDescriptionHandler.setDescription(t.body,this.sessionDescriptionHandlerOptions,this.modifiers).then(this.sessionDescriptionHandler.getDescription.bind(this.sessionDescriptionHandler,this.sessionDescriptionHandlerOptions,this.modifiers)).then(function(e){s.isCanceled||s.status===a.STATUS_TERMINATED||(s.status=a.STATUS_CONFIRMED,s.hasAnswer=!0,s.emit("ack",t.transaction.sendACK({body:e})),s.accepted(t))}).catch(function(i){i instanceof e.Exceptions.GetDescriptionError?s.logger.warn("there was a problem"):(s.logger.warn("invalid description"),s.logger.warn(i),s.acceptAndTerminate(t,488,"Invalid session description"),s.failed(t,e.C.causes.BAD_MEDIA_DESCRIPTION))})}break;default:i=e.Utils.sipErrorCause(t.status_code),this.rejected(t,i),this.failed(t,i),this.terminated(t,i)}}},cancel:function(t){if(t=t||{},t.extraHeaders=(t.extraHeaders||[]).slice(),this.status===a.STATUS_TERMINATED||this.status===a.STATUS_CONFIRMED)throw new e.Exceptions.InvalidStateError(this.status);this.logger.log("canceling RTCSession");var i=e.Utils.getCancelReason(t.status_code,t.reason_phrase);return this.status===a.STATUS_NULL||this.status===a.STATUS_INVITE_SENT&&!this.received_100?(this.isCanceled=!0,this.cancelReason=i):this.status!==a.STATUS_INVITE_SENT&&this.status!==a.STATUS_1XX_RECEIVED&&this.status!==a.STATUS_EARLY_MEDIA||this.request.cancel(i,t.extraHeaders),this.canceled()},terminate:function(e){return this.status===a.STATUS_TERMINATED?this:(this.status===a.STATUS_WAITING_FOR_ACK||this.status===a.STATUS_CONFIRMED?this.bye(e):this.cancel(e),this)},receiveRequest:function(t){return t.method,e.C.CANCEL,t.method===e.C.ACK&&this.status===a.STATUS_WAITING_FOR_ACK&&(e.Timers.clearTimeout(this.timers.ackTimer),e.Timers.clearTimeout(this.timers.invite2xxTimer),this.status=a.STATUS_CONFIRMED,this.accepted()),s.prototype.receiveRequest.apply(this,[t])},onTransportError:function(){this.status!==a.STATUS_CONFIRMED&&this.status!==a.STATUS_TERMINATED&&this.failed(null,e.C.causes.CONNECTION_ERROR)},onRequestTimeout:function(){this.status===a.STATUS_CONFIRMED?this.terminated(null,e.C.causes.REQUEST_TIMEOUT):this.status!==a.STATUS_TERMINATED&&(this.failed(null,e.C.causes.REQUEST_TIMEOUT),this.terminated(null,e.C.causes.REQUEST_TIMEOUT))}},e.InviteClientContext=n}},function(e,t,i){"use strict";e.exports=function(e){var t,i={MIN_DURATION:70,MAX_DURATION:6e3,DEFAULT_DURATION:100,MIN_INTER_TONE_GAP:50,DEFAULT_INTER_TONE_GAP:500};return t=function(i,s,r){var n,o;if(void 0===s)throw new TypeError("Not enough arguments");if(this.logger=i.ua.getLogger("sip.invitecontext.dtmf",i.id),this.owner=i,this.direction=null,r=r||{},n=r.duration||null,o=r.interToneGap||null,"string"==typeof s)s=s.toUpperCase();else{if("number"!=typeof s)throw new TypeError("Invalid tone: "+s);s=s.toString()}if(!s.match(/^[0-9A-D#*]$/))throw new TypeError("Invalid tone: "+s);if(this.tone=s,n&&!e.Utils.isDecimal(n))throw new TypeError("Invalid tone duration: "+n);if(n?nt.C.MAX_DURATION?(this.logger.warn('"duration" value is greater than the maximum allowed, setting it to '+t.C.MAX_DURATION+" milliseconds"),n=t.C.MAX_DURATION):n=Math.abs(n):n=t.C.DEFAULT_DURATION,this.duration=n,o&&!e.Utils.isDecimal(o))throw new TypeError("Invalid interToneGap: "+o);o?o=300||"notify_wait"!==this.state&&-1!==this.errorCodes.indexOf(t.status_code)?this.failed(t,null):/^2[0-9]{2}$/.test(t.status_code)?(this.emit("accepted",t,r),i=t.getHeader("Expires"),i&&i<=this.requestedExpires?(this.expires=i,this.timers.sub_duration=e.Timers.setTimeout(s.refresh.bind(s),900*i)):i?(this.logger.warn("Expires header in a 200-class response to SUBSCRIBE with a higher value than the one in the request"),this.failed(t,e.C.INVALID_EXPIRES_HEADER)):(this.logger.warn("Expires header missing in a 200-class response to SUBSCRIBE"),this.failed(t,e.C.EXPIRES_HEADER_MISSING))):t.statusCode>300&&(this.emit("failed",t,r),this.emit("rejected",t,r))},unsubscribe:function(){var t=[],i=this;this.state="terminated",t.push("Event: "+this.event),t.push("Expires: 0"),t.push("Contact: "+this.contact),t.push("Allow: "+e.UA.C.ALLOWED_METHODS.toString()),this.receiveResponse=function(){},this.dialog.sendRequest(this,this.method,{extraHeaders:t,body:this.body}),e.Timers.clearTimeout(this.timers.sub_duration),e.Timers.clearTimeout(this.timers.N),this.timers.N=e.Timers.setTimeout(i.timer_fire.bind(i),e.Timers.TIMER_N)},timer_fire:function(){"terminated"===this.state?(this.terminateDialog(),e.Timers.clearTimeout(this.timers.N),e.Timers.clearTimeout(this.timers.sub_duration),delete this.ua.subscriptions[this.id]):"notify_wait"===this.state||"pending"===this.state?this.close():this.refresh()},close:function(){"notify_wait"===this.state?(this.state="terminated",e.Timers.clearTimeout(this.timers.N),e.Timers.clearTimeout(this.timers.sub_duration),this.receiveResponse=function(){},delete this.ua.earlySubscriptions[this.request.call_id+this.request.from.parameters.tag+this.event]):"terminated"!==this.state&&this.unsubscribe()},createConfirmedDialog:function(t,i){var s;return this.terminateDialog(),s=new e.Dialog(this,t,i),s.invite_seqnum=this.request.cseq,s.local_seqnum=this.request.cseq,!s.error&&(this.dialog=s,!0)},terminateDialog:function(){this.dialog&&(delete this.ua.subscriptions[this.id],this.dialog.terminate(),delete this.dialog)},receiveRequest:function(t){function i(){s.expires&&(e.Timers.clearTimeout(r.timers.sub_duration),s.expires=Math.min(r.expires,Math.max(s.expires,0)),r.timers.sub_duration=e.Timers.setTimeout(r.refresh.bind(r),900*s.expires))}var s,r=this;if(!this.matchEvent(t))return void t.reply(489);if(this.dialog||this.createConfirmedDialog(t,"UAS")&&(this.id=this.dialog.id.toString(),delete this.ua.earlySubscriptions[this.request.call_id+this.request.from.parameters.tag+this.event],this.ua.subscriptions[this.id]=this),s=t.parseHeader("Subscription-State"),t.reply(200,e.C.REASON_200),e.Timers.clearTimeout(this.timers.N),this.emit("notify",{request:t}),"terminated"===this.state)return void("terminated"===s.state&&(this.terminateDialog(),e.Timers.clearTimeout(this.timers.N),e.Timers.clearTimeout(this.timers.sub_duration),delete this.ua.subscriptions[this.id]));switch(s.state){case"active":this.state="active",i();break;case"pending":"notify_wait"===this.state&&i(),this.state="pending";break;case"terminated":if(e.Timers.clearTimeout(this.timers.sub_duration),s.reason)switch(this.logger.log("terminating subscription with reason "+s.reason),s.reason){case"deactivated":case"timeout":return void this.subscribe();case"probation":case"giveup":return void(s.params&&s.params["retry-after"]?this.timers.sub_duration=e.Timers.setTimeout(r.subscribe.bind(r),s.params["retry-after"]):this.subscribe())}this.close()}},failed:function(e,t){return this.close(),this.emit("failed",e,t),this.emit("rejected",e,t),this},onDialogError:function(t){this.failed(t,e.C.causes.DIALOG_ERROR)},matchEvent:function(e){var t;return e.hasHeader("Event")?e.hasHeader("Subscription-State")?(t=e.parseHeader("event").event,this.event===t||(this.logger.warn("event match failed"),e.reply(481,"Event Match Failed"),!1)):(this.logger.warn("missing Subscription-State header"),!1):(this.logger.warn("missing Event header"),!1)}}}},function(e,t,i){"use strict";(function(t){e.exports=function(e,s){function r(t){if(t instanceof Function)return t.initialize||(t.initialize=function(){return e.Utils.Promise.resolve()}),t}var n,o={STATUS_INIT:0,STATUS_STARTING:1,STATUS_READY:2,STATUS_USER_CLOSED:3,STATUS_NOT_READY:4,CONFIGURATION_ERROR:1,NETWORK_ERROR:2,ALLOWED_METHODS:["ACK","CANCEL","INVITE","MESSAGE","BYE","OPTIONS","INFO","NOTIFY","REFER"],ACCEPTED_BODY_TYPES:["application/sdp","application/dtmf-relay"],MAX_FORWARDS:70,TAG_LENGTH:10};n=function(t){function i(e){return s.emit.bind(s,e)}var s=this;o.ACCEPTED_BODY_TYPES=o.ACCEPTED_BODY_TYPES.toString(),this.log=new e.LoggerFactory,this.logger=this.getLogger("sip.ua"),this.cache={credentials:{}},this.configuration={},this.dialogs={},this.applicants={},this.data={},this.sessions={},this.subscriptions={},this.earlySubscriptions={},this.transport=null,this.contact=null,this.status=o.STATUS_INIT,this.error=null,this.transactions={nist:{},nict:{},ist:{},ict:{}},this.transportRecoverAttempts=0,this.transportRecoveryTimer=null,Object.defineProperties(this,{transactionsCount:{get:function(){var e,t=["nist","nict","ist","ict"],i=0;for(e in t)i+=Object.keys(this.transactions[t[e]]).length;return i}},nictTransactionsCount:{get:function(){return Object.keys(this.transactions.nict).length}},nistTransactionsCount:{get:function(){return Object.keys(this.transactions.nist).length}},ictTransactionsCount:{get:function(){return Object.keys(this.transactions.ict).length}},istTransactionsCount:{get:function(){return Object.keys(this.transactions.ist).length}}}),void 0===t?t={}:("string"==typeof t||t instanceof String)&&(t={uri:t}),t.log&&(t.log.hasOwnProperty("builtinEnabled")&&(this.log.builtinEnabled=t.log.builtinEnabled),t.log.hasOwnProperty("level")&&(this.log.level=t.log.level),t.log.hasOwnProperty("connector")&&(this.log.connector=t.log.connector));try{this.loadConfig(t)}catch(e){throw this.status=o.STATUS_NOT_READY,this.error=o.CONFIGURATION_ERROR,e}this.registerContext=new e.RegisterContext(this),this.registerContext.on("failed",i("registrationFailed")),this.registerContext.on("registered",i("registered")),this.registerContext.on("unregistered",i("unregistered")),this.configuration.autostart&&this.start()},n.prototype=Object.create(e.EventEmitter.prototype),n.prototype.register=function(e){return this.configuration.register=!0,this.registerContext.register(e),this},n.prototype.unregister=function(e){this.configuration.register=!1;var t=this.registerContext;return this.afterConnected(t.unregister.bind(t,e)),this},n.prototype.isRegistered=function(){return this.registerContext.registered},n.prototype.isConnected=function(){return!!this.transport&&this.transport.connected},n.prototype.afterConnected=function(e){this.isConnected()?e():this.once("connected",e)},n.prototype.invite=function(t,i,s){var r=new e.InviteClientContext(this,t,i,s);return this.afterConnected(r.invite.bind(r)),this.emit("inviteSent",r),r},n.prototype.subscribe=function(t,i,s){var r=new e.Subscription(this,t,i,s);return this.afterConnected(r.subscribe.bind(r)),r},n.prototype.message=function(t,i,s){if(void 0===i)throw new TypeError("Not enough arguments");return s=Object.create(s||Object.prototype),s.contentType||(s.contentType="text/plain"),s.body=i,this.request(e.C.MESSAGE,t,s)},n.prototype.request=function(t,i,s){var r=new e.ClientContext(this,t,i,s);return this.afterConnected(r.send.bind(r)),r},n.prototype.stop=function(){function i(){0===c.nistTransactionsCount&&0===c.nictTransactionsCount&&(c.removeListener("transactionDestroyed",i),c.transport.disconnect())}var r,n,a,c=this;if(this.logger.log("user requested closure..."),this.status===o.STATUS_USER_CLOSED)return this.logger.warn("UA already closed"),this;e.Timers.clearTimeout(this.transportRecoveryTimer),this.logger.log("closing registerContext"),this.registerContext.close();for(r in this.sessions)this.logger.log("closing session "+r),this.sessions[r].terminate();for(n in this.subscriptions)this.logger.log("unsubscribing from subscription "+n),this.subscriptions[n].close();for(n in this.earlySubscriptions)this.logger.log("unsubscribing from early subscription "+n),this.earlySubscriptions[n].close();for(a in this.applicants)this.applicants[a].close();return this.status=o.STATUS_USER_CLOSED,0===this.nistTransactionsCount&&0===this.nictTransactionsCount?this.transport.disconnect():this.on("transactionDestroyed",i),"function"==typeof s.removeEventListener&&(t.chrome&&t.chrome.app&&t.chrome.app.runtime||s.removeEventListener("unload",this.environListener)),this},n.prototype.start=function(){var i;return this.logger.log("user requested startup..."),this.status===o.STATUS_INIT?(i=this.getNextWsServer(),this.status=o.STATUS_STARTING,new e.Transport(this,i)):this.status===o.STATUS_USER_CLOSED?(this.logger.log("resuming"),this.status=o.STATUS_READY,this.transport.connect()):this.status===o.STATUS_STARTING?this.logger.log("UA is in STARTING status, not opening new connection"):this.status===o.STATUS_READY?this.logger.log("UA is in READY status, not resuming"):this.logger.error("Connection is down. Auto-Recovery system is trying to connect"),this.configuration.autostop&&"function"==typeof s.addEventListener&&(t.chrome&&t.chrome.app&&t.chrome.app.runtime||(this.environListener=this.stop.bind(this),s.addEventListener("unload",this.environListener))),this},n.prototype.normalizeTarget=function(t){return e.Utils.normalizeTarget(t,this.configuration.hostportParams)},n.prototype.saveCredentials=function(e){return this.cache.credentials[e.realm]=this.cache.credentials[e.realm]||{},this.cache.credentials[e.realm][e.uri]=e,this},n.prototype.getCredentials=function(e){var t,i;return t=e.ruri.host,this.cache.credentials[t]&&this.cache.credentials[t][e.ruri]&&(i=this.cache.credentials[t][e.ruri],i.method=e.method),i},n.prototype.getLogger=function(e,t){return this.log.getLogger(e,t)},n.prototype.onTransportClosed=function(t){var i,s,r,n=["nict","ict","nist","ist"];for(t.server.status=e.Transport.C.STATUS_DISCONNECTED,this.logger.log("connection state set to "+e.Transport.C.STATUS_DISCONNECTED),r=n.length,i=0;i0?(t.reply(200,null),l.emit("notify",{request:t})):t.reply(481,"Subscription does not exist");break;default:t.reply(405)}},n.prototype.findSession=function(e){return this.sessions[e.call_id+e.from_tag]||this.sessions[e.call_id+e.to_tag]||null},n.prototype.findDialog=function(e){return this.dialogs[e.call_id+e.from_tag+e.to_tag]||this.dialogs[e.call_id+e.to_tag+e.from_tag]||null},n.prototype.findEarlySubscription=function(e){return this.earlySubscriptions[e.call_id+e.to_tag+e.getHeader("event")]||null},n.prototype.getNextWsServer=function(){var t,i,s,r=[];for(i=this.configuration.wsServers.length,t=0;tr[0].weight?r=[s]:s.weight===r[0].weight&&r.push(s));return t=Math.floor(Math.random()*r.length),r[t]},n.prototype.closeSessionsOnTransportError=function(){var e;for(e in this.sessions)this.sessions[e].onTransportError();this.registerContext.onTransportClosed()},n.prototype.recoverTransport=function(t){var i,s,r,n,o,a;for(t=t||this,o=t.transportRecoverAttempts,s=t.configuration.wsServers.length,i=0;it.configuration.connectionRecoveryMaxInterval&&(this.logger.log("time for next connection attempt exceeds connectionRecoveryMaxInterval, resetting counter"),n=t.configuration.connectionRecoveryMinInterval,o=0),this.logger.log("next connection attempt in "+n+" seconds"),this.transportRecoveryTimer=e.Timers.setTimeout(function(){t.transportRecoverAttempts=o+1,new e.Transport(t,a)},1e3*n)},n.prototype.loadConfig=function(t){function s(e,i){var s=e.replace(/([a-z][A-Z])/g,function(e){return e[0]+"_"+e[1].toLowerCase()});if(e!==s){var r=t.hasOwnProperty(e);t.hasOwnProperty(s)&&(i.warn(s+" is deprecated, please use "+e),r&&i.warn(e+" overriding "+s)),t[e]=r?t[e]:t[s]}}var n,o,a,c,h,u={viaHost:e.Utils.createRandomToken(12)+".invalid",uri:new e.URI("sip","anonymous."+e.Utils.createRandomToken(6),"anonymous.invalid",null,null),wsServers:[{scheme:"WSS",sip_uri:"",status:0,weight:0,ws_uri:"wss://edge.sip.onsip.com"}],custom:{},displayName:"",password:null,registerExpires:600,register:!0,registrarServer:null,wsServerMaxReconnection:3,wsServerReconnectionTimeout:4,connectionRecoveryMinInterval:2,connectionRecoveryMaxInterval:30,keepAliveInterval:0,extraSupported:[],usePreloadedRoute:!1,userAgentString:e.C.USER_AGENT,noAnswerTimeout:60,traceSip:!1,hackViaTcp:!1,hackIpInContact:!1,hackWssInTransport:!1,hackAllowUnregisteredOptionTags:!1,sessionDescriptionHandlerFactoryOptions:{constraints:{},peerConnectionOptions:{iceCheckingTimeout:5e3,rtcConfiguration:{}}},contactName:e.Utils.createRandomToken(8),contactTransport:"ws",forceRport:!1,autostart:!0,autostop:!0,rel100:e.C.supported.UNSUPPORTED,replaces:e.C.supported.UNSUPPORTED,sessionDescriptionHandlerFactory:i(27)(e).defaultFactory,authenticationFactory:r(function(t){return new e.DigestAuthentication(t)}),allowLegacyNotifications:!1},l=this.getConfigurationCheck();for(n in l.mandatory){if(s(n,this.logger),!t.hasOwnProperty(n))throw new e.Exceptions.ConfigurationError(n);if(o=t[n],void 0===(a=l.mandatory[n](o)))throw new e.Exceptions.ConfigurationError(n,o);u[n]=a}for(n in l.optional)if(s(n,this.logger),t.hasOwnProperty(n)){if((o=t[n])instanceof Array&&0===o.length)continue;if(null===o||""===o||void 0===o)continue;if("number"==typeof o&&isNaN(o))continue;if(void 0===(a=l.optional[n](o)))throw new e.Exceptions.ConfigurationError(n,o);u[n]=a}if(u.connectionRecoveryMaxInterval"}};var d={};for(n in u)d[n]={value:u[n],writable:"register"===n||"custom"===n,configurable:!1};Object.defineProperties(this.configuration,d),this.logger.log("configuration parameters after validation:");for(n in u)switch(n){case"uri":case"registrarServer":case"sessionDescriptionHandlerFactory":this.logger.log("· "+n+": "+u[n]);break;case"password":this.logger.log("· "+n+": NOT SHOWN");break;default:this.logger.log("· "+n+": "+JSON.stringify(u[n]))}},n.prototype.getConfigurationCheck=function(){return{mandatory:{},optional:{uri:function(t){var i;return/^sip:/i.test(t)||(t=e.C.SIP+":"+t),i=e.URI.parse(t),i&&i.user?i:void 0},wsServers:function(t){var i,s,r;if("string"==typeof t)t=[{ws_uri:t}];else{if(!(t instanceof Array))return;for(s=t.length,i=0;i",t[i].weight||(t[i].weight=0),t[i].status=0,t[i].scheme=r.scheme.toUpperCase()}return t},authorizationUser:function(t){return-1===e.Grammar.parse('"'+t+'"',"quoted_string")?void 0:t},connectionRecoveryMaxInterval:function(t){var i;if(e.Utils.isDecimal(t)&&(i=Number(t))>0)return i},connectionRecoveryMinInterval:function(t){var i;if(e.Utils.isDecimal(t)&&(i=Number(t))>0)return i},displayName:function(t){return-1===e.Grammar.parse('"'+t+'"',"displayName")?void 0:t},hackViaTcp:function(e){if("boolean"==typeof e)return e},hackIpInContact:function(t){return"boolean"==typeof t?t:"string"==typeof t&&-1!==e.Grammar.parse(t,"host")?t:void 0},hackWssInTransport:function(e){if("boolean"==typeof e)return e},hackAllowUnregisteredOptionTags:function(e){if("boolean"==typeof e)return e},contactTransport:function(e){if("string"==typeof e)return e},forceRport:function(e){if("boolean"==typeof e)return e},instanceId:function(t){if("string"==typeof t)return/^uuid:/i.test(t)&&(t=t.substr(5)),-1===e.Grammar.parse(t,"uuid")?void 0:t},keepAliveInterval:function(t){var i;if(e.Utils.isDecimal(t)&&(i=Number(t))>0)return i},extraSupported:function(e){var t,i;if(e instanceof Array){for(i=e.length,t=0;t0)return i},password:function(e){return String(e)},rel100:function(t){return t===e.C.supported.REQUIRED?e.C.supported.REQUIRED:t===e.C.supported.SUPPORTED?e.C.supported.SUPPORTED:e.C.supported.UNSUPPORTED},replaces:function(t){return t===e.C.supported.REQUIRED?e.C.supported.REQUIRED:t===e.C.supported.SUPPORTED?e.C.supported.SUPPORTED:e.C.supported.UNSUPPORTED},register:function(e){if("boolean"==typeof e)return e},registerExpires:function(t){var i;if(e.Utils.isDecimal(t)&&(i=Number(t))>0)return i},registrarServer:function(t){var i;if("string"==typeof t)return/^sip:/i.test(t)||(t=e.C.SIP+":"+t),i=e.URI.parse(t),i?i.user?void 0:i:void 0},traceSip:function(e){if("boolean"==typeof e)return e},rtcpMuxPolicy:function(e){if("string"==typeof e)return e},userAgentString:function(e){if("string"==typeof e)return e},usePreloadedRoute:function(e){if("boolean"==typeof e)return e},wsServerMaxReconnection:function(t){var i;if(e.Utils.isDecimal(t)&&(i=Number(t))>0)return i},wsServerReconnectionTimeout:function(t){var i;if(e.Utils.isDecimal(t)&&(i=Number(t))>0)return i},autostart:function(e){if("boolean"==typeof e)return e},autostop:function(e){if("boolean"==typeof e)return e},sessionDescriptionHandlerFactory:function(e){if(e instanceof Function)return e},sessionDescriptionHandlerFactoryOptions:function(e){if("object"==typeof e)return e},authenticationFactory:r,allowLegacyNotifications:function(e){if("boolean"==typeof e)return e},custom:function(e){if("object"==typeof e)return e},contactName:function(e){if("string"==typeof e)return e}}}},n.C=o,e.UA=n}}).call(t,i(0))},function(e,t,i){"use strict";(function(t){e.exports=function(e){var i=function(e,i){this.options=i||{},this.logger=e.ua.getLogger("sip.invitecontext.sessionDescriptionHandler",e.id),this.session=e,this.CONTENT_TYPE="application/sdp",this.modifiers=this.options.modifiers||[],Array.isArray(this.modifiers)||(this.modifiers=[this.modifiers]);var s=t.window||t;this.WebRTC={MediaStream:s.MediaStream,getUserMedia:s.navigator.mediaDevices.getUserMedia.bind(s.navigator.mediaDevices),RTCPeerConnection:s.RTCPeerConnection,RTCSessionDescription:s.RTCSessionDescription},this.initPeerConnection(this.options.peerConnectionOptions),this.constraints=this.checkAndDefaultConstraints(this.options.constraints),this.session.emit("SessionDescriptionHandler-created",this)};return i.defaultFactory=function(e,t){return new i(e,t)},i.prototype=Object.create(e.SessionDescriptionHandler.prototype,{close:{writable:!0,value:function(){this.logger.log("closing PeerConnection"),this.peerConnection&&"closed"!==this.peerConnection.signalingState&&(this.peerConnection.getSenders?this.peerConnection.getSenders().forEach(function(e){e.track&&e.track.stop()}):(this.logger.warn("Using getLocalStreams which is deprecated"),this.peerConnection.getLocalStreams().forEach(function(e){e.getTracks().forEach(function(e){e.stop()})})),this.peerConnection.getReceivers?this.peerConnection.getReceivers().forEach(function(e){e.track&&e.track.stop()}):(this.logger.warn("Using getRemoteStreams which is deprecated"),this.peerConnection.getRemoteStreams().forEach(function(e){e.getTracks().forEach(function(e){e.stop()})})),this.peerConnection.close())}},getDescription:{writable:!0,value:function(t,i){var s=this,r=!0;return this.session.disableRenegotiation?(this.logger.warn('The flag "disableRenegotiation" is set to true for this session description handler. We will not try to renegotiate.'),e.Utils.Promise.reject(new e.Exceptions.RenegotiationError("disableRenegotiation flag set to true for this session description handler"))):(t=t||{},t.peerConnectionOptions&&this.initPeerConnection(t.peerConnectionOptions),this.constraints&&t.constraints&&this.constraints===t.constraints&&(r=!1),this.constraints=Object.assign(this.constraints,t.constraints),this.constraints=this.checkAndDefaultConstraints(this.constraints),i=i||[],Array.isArray(i)||(i=[i]),i=i.concat(this.modifiers),!r&&this.peerConnection.localDescription&&this.peerConnection.localDescription.sdp&&""!==this.peerConnection.localDescription.sdp?this.createOfferOrAnswer({},i).then(function(e){return{body:e,contentType:s.CONTENT_TYPE}}):(s.logger.log("acquiring local media"),this.acquire(s.constraints).then(function(e){return s.logger.log("acquired local media streams"),e},function(e){throw s.logger.error("unable to acquire streams"),s.logger.error(e),e}).then(function(t){try{t=[].concat(t),t.forEach(function(e){s.peerConnection.addTrack?e.getTracks().forEach(function(t){s.peerConnection.addTrack(t,e)}):s.peerConnection.addStream(e)},this)}catch(t){return s.logger.error("error adding stream"),s.logger.error(t),e.Utils.Promise.reject(t)}return e.Utils.Promise.resolve()}).then(function(){return s.createOfferOrAnswer(t.RTCOfferOptions,i)}).then(function(e){return{body:e,contentType:s.CONTENT_TYPE}}).catch(function(e){throw this.session.disableRenegotiation=!0,e})))}},hasDescription:{writable:!0,value:function(e){return e===this.CONTENT_TYPE}},holdModifier:{writable:!0,value:function(t){return/a=(sendrecv|sendonly|recvonly|inactive)/.test(t.sdp)?(t.sdp=t.sdp.replace(/a=sendrecv\r\n/g,"a=sendonly\r\n"),t.sdp=t.sdp.replace(/a=recvonly\r\n/g,"a=inactive\r\n")):t.sdp=t.sdp.replace(/(m=[^\r]*\r\n)/g,"$1a=sendonly\r\n"),e.Utils.Promise.resolve(t)}},setDescription:{writable:!0,value:function(t,i,s){var r=this,n="undefined"!=typeof InstallTrigger;if(!this.session.disableRenegotiation&&n&&this.peerConnection&&this.isVideoHold(t)&&(this.session.disableRenegotiation=!0),this.session.disableRenegotiation)return this.logger.warn('The flag "disableRenegotiation" is set to true for this session description handler. We will not try to renegotiate.'),e.Utils.Promise.reject(new e.Exceptions.RenegotiationError("disableRenegotiation flag set to true for this session description handler"));i=i||{},i.peerConnectionOptions&&this.initPeerConnection(i.peerConnectionOptions),this.constraints=Object.assign(this.constraints,i.constraints),this.constraints=this.checkAndDefaultConstraints(this.constraints),s=s||[],Array.isArray(s)||(s=[s]),s=s.concat(this.modifiers);var o={type:this.hasOffer("local")?"answer":"offer",sdp:t};return e.Utils.reducePromises(s,o).catch(function(e){throw r.logger.error("The modifiers did not resolve successfully"),r.logger.error(e),e}).then(function(e){return r.emit("setDescription",e),r.peerConnection.setRemoteDescription(new r.WebRTC.RTCSessionDescription(e))}).catch(function(e){throw r.session.disableRenegotiation=!0,r.logger.error(e),r.emit("peerConnection-setRemoteDescriptionFailed",e),e}).then(function(){r.peerConnection.getRemoteStreams?r.emit("setRemoteDescription",r.peerConnection.getRemoteStreams()):r.emit("setRemoteDescription",r.peerConnection.getReceivers()),r.emit("confirmed",r)})}},createOfferOrAnswer:{writable:!0,value:function(t,i){var s,r=this,n=this.peerConnection;return t=t||{},s=r.hasOffer("remote")?"createAnswer":"createOffer",n[s](t).catch(function(e){throw r.emit("peerConnection-"+s+"Failed",e),e}).then(function(t){return e.Utils.reducePromises(i,t)}).then(function(e){return r.logger.log(e),n.setLocalDescription(e)}).catch(function(e){throw r.emit("peerConnection-SetLocalDescriptionFailed",e),e}).then(function(){return new e.Utils.Promise(function(e){"complete"!==n.iceGatheringState||"connected"!==n.iceConnectionState&&"completed"!==n.iceConnectionState?r.onIceCompleted.promise.then(e):e()})}).then(function(){var e=r.peerConnection.localDescription;return r.emit("getDescription",e),e.sdp}).catch(function(t){throw r.logger.error(t),new e.Exceptions.GetDescriptionError(t)})}},addDefaultIceServers:{writable:!0,value:function(e){return e.iceServers||(e.iceServers=[{urls:"stun:stun.l.google.com:19302"}]),e}},checkAndDefaultConstraints:{writable:!0,value:function(e){var t={audio:!0,video:!0};return e=e||t,0===Object.keys(e).length&&e.constructor===Object?t:e}},initPeerConnection:{writable:!0,value:function(t){var i=this;t=t||{},t.rtcConfiguration=t.rtcConfiguration||{},t.rtcConfiguration=this.addDefaultIceServers(t.rtcConfiguration),this.onIceCompleted=e.Utils.defer(),this.onIceCompleted.promise.then(function(t){i.emit("iceGatheringComplete",t),i.iceCheckingTimer&&(e.Timers.clearTimeout(i.iceCheckingTimer),i.iceCheckingTimer=null)}),this.peerConnection&&this.peerConnection.close(),this.peerConnection=new this.WebRTC.RTCPeerConnection(t.rtcConfiguration),this.session.emit("peerConnection-created",this.peerConnection),this.peerConnection.ontrack=function(e){i.logger.log("track added"),i.emit("addTrack",e)},this.peerConnection.onaddstream=function(e){i.logger.warn("Using deprecated stream API"),i.logger.log("stream added"),i.emit("addStream",e)},this.peerConnection.onremovestream=function(e){i.logger.log("stream removed: "+e.stream.id)},this.startIceCheckingTimer=function(){!i.iceCheckingTimer&&t.iceCheckingTimeout&&(i.iceCheckingTimer=e.Timers.setTimeout(function(){i.logger.log("RTCIceChecking Timeout Triggered after "+t.iceCheckingTimeout+" milliseconds"),i.onIceCompleted.resolve(this)}.bind(this.peerConnection),t.iceCheckingTimeout))},this.peerConnection.onicecandidate=function(e){i.emit("iceCandidate",e),e.candidate?(i.logger.log("ICE candidate received: "+(null===e.candidate.candidate?null:e.candidate.candidate.trim())),i.startIceCheckingTimer()):i.onIceCompleted.resolve(this)},this.peerConnection.onicegatheringstatechange=function(){i.logger.log("RTCIceGatheringState changed: "+this.iceGatheringState),"gathering"===this.iceGatheringState&&i.emit("iceGathering",this),"complete"===this.iceGatheringState&&i.onIceCompleted.resolve(this)},this.peerConnection.oniceconnectionstatechange=function(){var e;switch("checking"===this.iceConnectionState&&i.startIceCheckingTimer(),this.iceConnectionState){case"new":e="iceConnection";break;case"checking":e="iceConnectionChecking";break;case"connected":e="iceConnectionConnected";break;case"completed":e="iceConnectionCompleted";break;case"failed":e="iceConnectionFailed";break;case"disconnected":e="iceConnectionDisconnected";break;case"closed":e="iceConnectionClosed";break;default:return void i.logger.warn("Unknown iceConnection state:",this.iceConnectionState)}i.emit(e,this)}}},acquire:{writable:!0,value:function(t){return t=this.checkAndDefaultConstraints(t),new e.Utils.Promise(function(e,i){this.emit("userMediaRequest",t);var s=function(e,t){var i=Array.prototype.slice.call(arguments,2),s=[e].concat(i);return this.emit.apply(this,s),t.apply(null,i)}.bind(this);t.audio||t.video?this.WebRTC.getUserMedia(t).then(s.bind(this,"userMedia",function(t){e(t)}),s.bind(this,"userMediaFailed",function(e){throw i(e),e})):e([])}.bind(this))}},isVideoHold:{writable:!0,value:function(e){return-1!==e.search(/^(m=video.*?)[\s\S]*^(a=sendonly?)/gm)}},hasOffer:{writable:!0,value:function(e){var t="have-"+e+"-offer";return this.peerConnection.signalingState===t}}}),i}}).call(t,i(0))},function(e,t,i){"use strict";e.exports=function(e){function t(t,i,s){var r,n=e.Utils.buildStatusLine(t),o=i.getHeaders("via"),a=o.length,c=0;for(c;c1)return t.getLogger("sip.sanitycheck").warn("More than one Via header field present in the response. Dropping the response"),!1}function a(e,t){var i=t.configuration.viaHost;if(e.via.host!==i||void 0!==e.via.port)return t.getLogger("sip.sanitycheck").warn("Via sent-by in the response does not match UA Via host value. Dropping the response"),!1}function c(t,i){if(e.Utils.str_utf8_length(t.body)-1)this.qop="auth";else{if(!(i.qop.indexOf("auth-int")>-1))return this.logger.warn('challenge without Digest qop different than "auth" or "auth-int", authentication aborted'),!1;this.qop="auth-int"}else this.qop=null;return this.method=t.method,this.uri=t.ruri,this.cnonce=e.createRandomToken(12),this.nc+=1,this.updateNcHex(),4294967296===this.nc&&(this.nc=1,this.ncHex="00000001"),this.calculateResponse(),!0},t.prototype.calculateResponse=function(){var t,i;t=e.calculateMD5(this.username+":"+this.realm+":"+this.password),"auth"===this.qop?(i=e.calculateMD5(this.method+":"+this.uri),this.response=e.calculateMD5(t+":"+this.nonce+":"+this.ncHex+":"+this.cnonce+":auth:"+i)):"auth-int"===this.qop?(i=e.calculateMD5(this.method+":"+this.uri+":"+e.calculateMD5(this.body?this.body:"")),this.response=e.calculateMD5(t+":"+this.nonce+":"+this.ncHex+":"+this.cnonce+":auth-int:"+i)):null===this.qop&&(i=e.calculateMD5(this.method+":"+this.uri),this.response=e.calculateMD5(t+":"+this.nonce+":"+i))},t.prototype.toString=function(){var e=[];if(!this.response)throw new Error("response field does not exist, cannot generate Authorization header");return e.push("algorithm="+this.algorithm),e.push('username="'+this.username+'"'),e.push('realm="'+this.realm+'"'),e.push('nonce="'+this.nonce+'"'),e.push('uri="'+this.uri+'"'),e.push('response="'+this.response+'"'),this.opaque&&e.push('opaque="'+this.opaque+'"'),this.qop&&(e.push("qop="+this.qop),e.push('cnonce="'+this.cnonce+'"'),e.push("nc="+this.ncHex)),"Digest "+e.join(", ")},t.prototype.updateNcHex=function(){var e=Number(this.nc).toString(16);this.ncHex="00000000".substr(0,8-e.length)+e},t}},function(e,t,i){"use strict";var s=i(31);e.exports=function(e){return{parse:function(t,i){var r={startRule:i,SIP:e};try{s.parse(t,r)}catch(e){r.data=-1}return r.data}}}},function(e,t,i){"use strict";function s(e,t,i,r){this.message=e,this.expected=t,this.found=i,this.location=r,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,s)}function r(e,t){function i(){return e.substring(v,C)}function r(){return h(v,C)}function n(e,t){return{type:"literal",text:e,ignoreCase:t}}function o(e,t,i){return{type:"class",parts:e,inverted:t,ignoreCase:i}}function a(e){return{type:"other",description:e}}function c(t){var i,s=R[t];if(s)return s;for(i=t-1;!R[i];)i--;for(s=R[i],s={line:s.line,column:s.column};iA&&(A=C,y=[]),y.push(e))}function l(e,t,i){return new s(s.buildMessage(e,t),e,t,i)}function d(e){var t,i=new Array(e.length);for(t=0;tC?(a=n+3+r[n+1],n+=3):(a=n+3+r[n+1]+r[n+2],n+=3+r[n+1]);break;case 18:c.push(a),o.push(n+4+r[n+2]+r[n+3]),e.substr(C,E[r[n+1]].length)===E[r[n+1]]?(a=n+4+r[n+2],n+=4):(a=n+4+r[n+2]+r[n+3],n+=4+r[n+2]);break;case 19:c.push(a),o.push(n+4+r[n+2]+r[n+3]),e.substr(C,E[r[n+1]].length).toLowerCase()===E[r[n+1]]?(a=n+4+r[n+2],n+=4):(a=n+4+r[n+2]+r[n+3],n+=4+r[n+2]);break;case 20:c.push(a),o.push(n+4+r[n+2]+r[n+3]),E[r[n+1]].test(e.charAt(C))?(a=n+4+r[n+2],n+=4):(a=n+4+r[n+2]+r[n+3],n+=4+r[n+2]);break;case 21:h.push(e.substr(C,r[n+1])),C+=r[n+1],n+=2;break;case 22:h.push(E[r[n+1]]),C+=E[r[n+1]].length,n+=2;break;case 23:h.push(T),0===I&&u(E[r[n+1]]),n+=2;break;case 24:v=h[h.length-1-r[n+1]],n+=2;break;case 25:v=C,n++;break;case 26:for(i=r.slice(n+4,n+4+r[n+3]),s=0;s0))break;a=c.pop(),n=o.pop()}return h[0]}function g(e,t){return[e].concat(t)}t=void 0!==t?t:{};var f,T={},m={Contact:118,Name_Addr_Header:155,Record_Route:175,Request_Response:81,SIP_URI:45,Subscription_State:185,Supported:190,Require:181,Via:193,absoluteURI:84,Call_ID:117,Content_Disposition:129,Content_Length:134,Content_Type:135,CSeq:145,displayName:121,Event:148,From:150,host:52,Max_Forwards:153,Min_SE:212,Proxy_Authenticate:156,quoted_string:40,Refer_To:177,Replaces:178,Session_Expires:209,stun_URI:216,To:191,turn_URI:222,uuid:225,WWW_Authenticate:208,challenge:157},_=118,E=["\r\n",n("\r\n",!1),/^[0-9]/,o([["0","9"]],!1,!1),/^[a-zA-Z]/,o([["a","z"],["A","Z"]],!1,!1),/^[0-9a-fA-F]/,o([["0","9"],["a","f"],["A","F"]],!1,!1),/^[\0-\xFF]/,o([["\0","ÿ"]],!1,!1),/^["]/,o(['"'],!1,!1)," ",n(" ",!1),"\t",n("\t",!1),/^[a-zA-Z0-9]/,o([["a","z"],["A","Z"],["0","9"]],!1,!1),";",n(";",!1),"/",n("/",!1),"?",n("?",!1),":",n(":",!1),"@",n("@",!1),"&",n("&",!1),"=",n("=",!1),"+",n("+",!1),"$",n("$",!1),",",n(",",!1),"-",n("-",!1),"_",n("_",!1),".",n(".",!1),"!",n("!",!1),"~",n("~",!1),"*",n("*",!1),"'",n("'",!1),"(",n("(",!1),")",n(")",!1),"%",n("%",!1),function(){return" "},function(){return":"},/^[!-~]/,o([["!","~"]],!1,!1),/^[\x80-\uFFFF]/,o([["€","￿"]],!1,!1),/^[\x80-\xBF]/,o([["€","¿"]],!1,!1),/^[a-f]/,o([["a","f"]],!1,!1),"`",n("`",!1),"<",n("<",!1),">",n(">",!1),"\\",n("\\",!1),"[",n("[",!1),"]",n("]",!1),"{",n("{",!1),"}",n("}",!1),function(){return"*"},function(){return"/"},function(){return"="},function(){return"("},function(){return")"},function(){return">"},function(){return"<"},function(){return","},function(){return";"},function(){return":"},function(){return'"'},/^[!-']/,o([["!","'"]],!1,!1),/^[*-[]/,o([["*","["]],!1,!1),/^[\]-~]/,o([["]","~"]],!1,!1),function(e){return e},/^[#-[]/,o([["#","["]],!1,!1),/^[\0-\t]/,o([["\0","\t"]],!1,!1),/^[\x0B-\f]/,o([["\v","\f"]],!1,!1),/^[\x0E-\x7F]/,o([["",""]],!1,!1),function(){t.data.uri=new t.SIP.URI(t.data.scheme,t.data.user,t.data.host,t.data.port),delete t.data.scheme,delete t.data.user,delete t.data.host,delete t.data.host_type,delete t.data.port},function(){t.data.uri=new t.SIP.URI(t.data.scheme,t.data.user,t.data.host,t.data.port,t.data.uri_params,t.data.uri_headers),delete t.data.scheme,delete t.data.user,delete t.data.host,delete t.data.host_type,delete t.data.port,delete t.data.uri_params,"SIP_URI"===t.startRule&&(t.data=t.data.uri)},"sips",n("sips",!0),"sip",n("sip",!0),function(e){t.data.scheme=e},function(){t.data.user=decodeURIComponent(i().slice(0,-1))},function(){t.data.password=i()},function(){return t.data.host=i(),t.data.host},function(){return t.data.host_type="domain",i()},/^[a-zA-Z0-9_\-]/,o([["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),/^[a-zA-Z0-9\-]/,o([["a","z"],["A","Z"],["0","9"],"-"],!1,!1),function(){return t.data.host_type="IPv6",i()},"::",n("::",!1),function(){return t.data.host_type="IPv6",i()},function(){return t.data.host_type="IPv4",i()},"25",n("25",!1),/^[0-5]/,o([["0","5"]],!1,!1),"2",n("2",!1),/^[0-4]/,o([["0","4"]],!1,!1),"1",n("1",!1),/^[1-9]/,o([["1","9"]],!1,!1),function(e){return e=parseInt(e.join("")),t.data.port=e,e},"transport=",n("transport=",!0),"udp",n("udp",!0),"tcp",n("tcp",!0),"sctp",n("sctp",!0),"tls",n("tls",!0),function(e){t.data.uri_params||(t.data.uri_params={}),t.data.uri_params.transport=e.toLowerCase()},"user=",n("user=",!0),"phone",n("phone",!0),"ip",n("ip",!0),function(e){t.data.uri_params||(t.data.uri_params={}),t.data.uri_params.user=e.toLowerCase()},"method=",n("method=",!0),function(e){t.data.uri_params||(t.data.uri_params={}),t.data.uri_params.method=e},"ttl=",n("ttl=",!0),function(e){t.data.params||(t.data.params={}),t.data.params.ttl=e},"maddr=",n("maddr=",!0),function(e){t.data.uri_params||(t.data.uri_params={}),t.data.uri_params.maddr=e},"lr",n("lr",!0),function(){t.data.uri_params||(t.data.uri_params={}),t.data.uri_params.lr=void 0},function(e,i){t.data.uri_params||(t.data.uri_params={}),i=null===i?void 0:i[1],t.data.uri_params[e.toLowerCase()]=i&&i.toLowerCase()},function(e,i){e=e.join("").toLowerCase(),i=i.join(""),t.data.uri_headers||(t.data.uri_headers={}),t.data.uri_headers[e]?t.data.uri_headers[e].push(i):t.data.uri_headers[e]=[i]},function(){"Refer_To"===t.startRule&&(t.data.uri=new t.SIP.URI(t.data.scheme,t.data.user,t.data.host,t.data.port,t.data.uri_params,t.data.uri_headers),delete t.data.scheme,delete t.data.user,delete t.data.host,delete t.data.host_type,delete t.data.port,delete t.data.uri_params)},"//",n("//",!1),function(){t.data.scheme=i()},n("SIP",!0),function(){t.data.sip_version=i()},"INVITE",n("INVITE",!1),"ACK",n("ACK",!1),"VXACH",n("VXACH",!1),"OPTIONS",n("OPTIONS",!1),"BYE",n("BYE",!1),"CANCEL",n("CANCEL",!1),"REGISTER",n("REGISTER",!1),"SUBSCRIBE",n("SUBSCRIBE",!1),"NOTIFY",n("NOTIFY",!1),"REFER",n("REFER",!1),function(){return t.data.method=i(),t.data.method},function(e){t.data.status_code=parseInt(e.join(""))},function(){t.data.reason_phrase=i()},function(){t.data=i()},function(){var e,i;for(i=t.data.multi_header.length,e=0;e""6>7?.A &2@""6@7A.5 &2B""6B7C.) &2D""6D7E'),d(";).# &;,"),d('2F""6F7G.} &2H""6H7I.q &2J""6J7K.e &2L""6L7M.Y &2N""6N7O.M &2P""6P7Q.A &2R""6R7S.5 &2T""6T7U.) &2V""6V7W'),d('%%2X""6X7Y/5#;#/,$;#/#$+#)(#\'#("\'#&\'#/"!&,)'),d('%%$;$0#*;$&/,#; /#$+")("\'#&\'#." &"/=#$;$/�#*;$&&&#/\'$8":Z" )("\'#&\'#'),d(';.." &"'),d("%$;'.# &;(0)*;'.# &;(&/?#28\"\"6879/0$;//'$8#:[# )(#'#(\"'#&'#"),d('%%$;2/�#*;2&&&#/g#$%$;.0#*;.&/,#;2/#$+")("\'#&\'#0=*%$;.0#*;.&/,#;2/#$+")("\'#&\'#&/#$+")("\'#&\'#/"!&,)'),d('4\\""5!7].# &;3'),d('4^""5!7_'),d('4`""5!7a'),d(';!.) &4b""5!7c'),d('%$;).• &2F""6F7G.‰ &2J""6J7K.} &2L""6L7M.q &2X""6X7Y.e &2P""6P7Q.Y &2H""6H7I.M &2@""6@7A.A &2d""6d7e.5 &2R""6R7S.) &2N""6N7O/ž#0›*;).• &2F""6F7G.‰ &2J""6J7K.} &2L""6L7M.q &2X""6X7Y.e &2P""6P7Q.Y &2H""6H7I.M &2@""6@7A.A &2d""6d7e.5 &2R""6R7S.) &2N""6N7O&&&#/"!&,)'),d('%$;).‰ &2F""6F7G.} &2L""6L7M.q &2X""6X7Y.e &2P""6P7Q.Y &2H""6H7I.M &2@""6@7A.A &2d""6d7e.5 &2R""6R7S.) &2N""6N7O/’#0*;).‰ &2F""6F7G.} &2L""6L7M.q &2X""6X7Y.e &2P""6P7Q.Y &2H""6H7I.M &2@""6@7A.A &2d""6d7e.5 &2R""6R7S.) &2N""6N7O&&&#/"!&,)'),d('2T""6T7U.ã &2V""6V7W.× &2f""6f7g.Ë &2h""6h7i.¿ &2:""6:7;.³ &2D""6D7E.§ &22""6273.› &28""6879. &2j""6j7k.ƒ &;&.} &24""6475.q &2l""6l7m.e &2n""6n7o.Y &26""6677.M &2>""6>7?.A &2p""6p7q.5 &2r""6r7s.) &;\'.# &;('),d('%$;).ī &2F""6F7G.ğ &2J""6J7K.ē &2L""6L7M.ć &2X""6X7Y.û &2P""6P7Q.ï &2H""6H7I.ã &2@""6@7A.× &2d""6d7e.Ë &2R""6R7S.¿ &2N""6N7O.³ &2T""6T7U.§ &2V""6V7W.› &2f""6f7g. &2h""6h7i.ƒ &28""6879.w &2j""6j7k.k &;&.e &24""6475.Y &2l""6l7m.M &2n""6n7o.A &26""6677.5 &2p""6p7q.) &2r""6r7s/Ĵ#0ı*;).ī &2F""6F7G.ğ &2J""6J7K.ē &2L""6L7M.ć &2X""6X7Y.û &2P""6P7Q.ï &2H""6H7I.ã &2@""6@7A.× &2d""6d7e.Ë &2R""6R7S.¿ &2N""6N7O.³ &2T""6T7U.§ &2V""6V7W.› &2f""6f7g. &2h""6h7i.ƒ &28""6879.w &2j""6j7k.k &;&.e &24""6475.Y &2l""6l7m.M &2n""6n7o.A &26""6677.5 &2p""6p7q.) &2r""6r7s&&&#/"!&,)'),d("%;//?#2P\"\"6P7Q/0$;//'$8#:t# )(#'#(\"'#&'#"),d("%;//?#24\"\"6475/0$;//'$8#:u# )(#'#(\"'#&'#"),d("%;//?#2>\"\"6>7?/0$;//'$8#:v# )(#'#(\"'#&'#"),d("%;//?#2T\"\"6T7U/0$;//'$8#:w# )(#'#(\"'#&'#"),d("%;//?#2V\"\"6V7W/0$;//'$8#:x# )(#'#(\"'#&'#"),d('%2h""6h7i/0#;//\'$8":y" )("\'#&\'#'),d('%;//6#2f""6f7g/\'$8":z" )("\'#&\'#'),d("%;//?#2D\"\"6D7E/0$;//'$8#:{# )(#'#(\"'#&'#"),d("%;//?#22\"\"6273/0$;//'$8#:|# )(#'#(\"'#&'#"),d("%;//?#28\"\"6879/0$;//'$8#:}# )(#'#(\"'#&'#"),d("%;//0#;&/'$8\":~\" )(\"'#&'#"),d("%;&/0#;//'$8\":~\" )(\"'#&'#"),d("%;=/T#$;G.) &;K.# &;F0/*;G.) &;K.# &;F&/,$;>/#$+#)(#'#(\"'#&'#"),d('4""5!7€.A &4""5!7‚.5 &4ƒ""5!7„.) &;3.# &;.'),d("%%;//Q#;&/H$$;J.# &;K0)*;J.# &;K&/,$;&/#$+$)($'#(#'#(\"'#&'#/\"!&,)"),d("%;//]#;&/T$%$;J.# &;K0)*;J.# &;K&/\"!&,)/1$;&/($8$:…$!!)($'#(#'#(\"'#&'#"),d(';..G &2L""6L7M.; &4†""5!7‡./ &4ƒ""5!7„.# &;3'),d('%2j""6j7k/J#4ˆ""5!7‰.5 &4Š""5!7‹.) &4Œ""5!7/#$+")("\'#&\'#'),d("%;N/M#28\"\"6879/>$;O.\" &\"/0$;S/'$8$:Ž$ )($'#(#'#(\"'#&'#"),d("%;N/d#28\"\"6879/U$;O.\" &\"/G$;S/>$;_/5$;l.\" &\"/'$8&:& )(&'#(%'#($'#(#'#(\"'#&'#"),d('%3""5$7‘.) &3’""5#7“/\' 8!:”!! )'),d('%;P/]#%28""6879/,#;R/#$+")("\'#&\'#." &"/6$2:""6:7;/\'$8#:•# )(#\'#("\'#&\'#'),d("$;+.) &;-.# &;Q/2#0/*;+.) &;-.# &;Q&&&#"),d('2<""6<7=.q &2>""6>7?.e &2@""6@7A.Y &2B""6B7C.M &2D""6D7E.A &22""6273.5 &26""6677.) &24""6475'),d('%$;+._ &;-.Y &2<""6<7=.M &2>""6>7?.A &2@""6@7A.5 &2B""6B7C.) &2D""6D7E0e*;+._ &;-.Y &2<""6<7=.M &2>""6>7?.A &2@""6@7A.5 &2B""6B7C.) &2D""6D7E&/& 8!:–! )'),d('%;T/J#%28""6879/,#;^/#$+")("\'#&\'#." &"/#$+")("\'#&\'#'),d("%;U.) &;\\.# &;X/& 8!:—! )"),d('%$%;V/2#2J""6J7K/#$+")("\'#&\'#0<*%;V/2#2J""6J7K/#$+")("\'#&\'#&/D#;W/;$2J""6J7K." &"/\'$8#:˜# )(#\'#("\'#&\'#'),d('$4™""5!7š/,#0)*4™""5!7š&&&#'),d('%4$""5!7%/?#$4›""5!7œ0)*4›""5!7œ&/#$+")("\'#&\'#'),d('%2l""6l7m/?#;Y/6$2n""6n7o/\'$8#:# )(#\'#("\'#&\'#'),d('%%;Z/³#28""6879/¤$;Z/›$28""6879/Œ$;Z/ƒ$28""6879/t$;Z/k$28""6879/\\$;Z/S$28""6879/D$;Z/;$28""6879/,$;[/#$+-)(-\'#(,\'#(+\'#(*\'#()\'#((\'#(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#.ސ &%2ž""6ž7Ÿ/¤#;Z/›$28""6879/Œ$;Z/ƒ$28""6879/t$;Z/k$28""6879/\\$;Z/S$28""6879/D$;Z/;$28""6879/,$;[/#$+,)(,\'#(+\'#(*\'#()\'#((\'#(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#.۹ &%2ž""6ž7Ÿ/Œ#;Z/ƒ$28""6879/t$;Z/k$28""6879/\\$;Z/S$28""6879/D$;Z/;$28""6879/,$;[/#$+*)(*\'#()\'#((\'#(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#.ٺ &%2ž""6ž7Ÿ/t#;Z/k$28""6879/\\$;Z/S$28""6879/D$;Z/;$28""6879/,$;[/#$+()((\'#(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#.ؓ &%2ž""6ž7Ÿ/\\#;Z/S$28""6879/D$;Z/;$28""6879/,$;[/#$+&)(&\'#(%\'#($\'#(#\'#("\'#&\'#.ׄ &%2ž""6ž7Ÿ/D#;Z/;$28""6879/,$;[/#$+$)($\'#(#\'#("\'#&\'#.֍ &%2ž""6ž7Ÿ/,#;[/#$+")("\'#&\'#.ծ &%2ž""6ž7Ÿ/,#;Z/#$+")("\'#&\'#.Տ &%;Z/›#2ž""6ž7Ÿ/Œ$;Z/ƒ$28""6879/t$;Z/k$28""6879/\\$;Z/S$28""6879/D$;Z/;$28""6879/,$;[/#$++)(+\'#(*\'#()\'#((\'#(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#.Ӈ &%;Z/ª#%28""6879/,#;Z/#$+")("\'#&\'#." &"/ƒ$2ž""6ž7Ÿ/t$;Z/k$28""6879/\\$;Z/S$28""6879/D$;Z/;$28""6879/,$;[/#$+*)(*\'#()\'#((\'#(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#.а &%;Z/¹#%28""6879/,#;Z/#$+")("\'#&\'#." &"/’$%28""6879/,#;Z/#$+")("\'#&\'#." &"/k$2ž""6ž7Ÿ/\\$;Z/S$28""6879/D$;Z/;$28""6879/,$;[/#$+))()\'#((\'#(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#.Ί &%;Z/È#%28""6879/,#;Z/#$+")("\'#&\'#." &"/¡$%28""6879/,#;Z/#$+")("\'#&\'#." &"/z$%28""6879/,#;Z/#$+")("\'#&\'#." &"/S$2ž""6ž7Ÿ/D$;Z/;$28""6879/,$;[/#$+()((\'#(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#.˕ &%;Z/×#%28""6879/,#;Z/#$+")("\'#&\'#." &"/°$%28""6879/,#;Z/#$+")("\'#&\'#." &"/‰$%28""6879/,#;Z/#$+")("\'#&\'#." &"/b$%28""6879/,#;Z/#$+")("\'#&\'#." &"/;$2ž""6ž7Ÿ/,$;[/#$+\')(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#.ȑ &%;Z/þ#%28""6879/,#;Z/#$+")("\'#&\'#." &"/×$%28""6879/,#;Z/#$+")("\'#&\'#." &"/°$%28""6879/,#;Z/#$+")("\'#&\'#." &"/‰$%28""6879/,#;Z/#$+")("\'#&\'#." &"/b$%28""6879/,#;Z/#$+")("\'#&\'#." &"/;$2ž""6ž7Ÿ/,$;Z/#$+()((\'#(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#.Ħ &%;Z/Ĝ#%28""6879/,#;Z/#$+")("\'#&\'#." &"/õ$%28""6879/,#;Z/#$+")("\'#&\'#." &"/Î$%28""6879/,#;Z/#$+")("\'#&\'#." &"/§$%28""6879/,#;Z/#$+")("\'#&\'#." &"/€$%28""6879/,#;Z/#$+")("\'#&\'#." &"/Y$%28""6879/,#;Z/#$+")("\'#&\'#." &"/2$2ž""6ž7Ÿ/#$+()((\'#(\'\'#(&\'#(%\'#($\'#(#\'#("\'#&\'#/& 8!: ! )'),d('%;#/M#;#." &"/?$;#." &"/1$;#." &"/#$+$)($\'#(#\'#("\'#&\'#'),d("%;Z/;#28\"\"6879/,$;Z/#$+#)(#'#(\"'#&'#.# &;\\"),d("%;]/o#2J\"\"6J7K/`$;]/W$2J\"\"6J7K/H$;]/?$2J\"\"6J7K/0$;]/'$8':¡' )(''#(&'#(%'#($'#(#'#(\"'#&'#"),d('%2¢""6¢7£/2#4¤""5!7¥/#$+")("\'#&\'#.˜ &%2¦""6¦7§/;#4¨""5!7©/,$;!/#$+#)(#\'#("\'#&\'#.j &%2ª""6ª7«/5#;!/,$;!/#$+#)(#\'#("\'#&\'#.B &%4¬""5!7­/,#;!/#$+")("\'#&\'#.# &;!'),d('%%;!." &"/[#;!." &"/M$;!." &"/?$;!." &"/1$;!." &"/#$+%)(%\'#($\'#(#\'#("\'#&\'#/\' 8!:®!! )'),d('$%22""6273/,#;`/#$+")("\'#&\'#0<*%22""6273/,#;`/#$+")("\'#&\'#&'),d(";a.A &;b.; &;c.5 &;d./ &;e.) &;f.# &;g"),d('%3¯""5*7°/a#3±""5#7².G &3³""5#7´.; &3µ""5$7¶./ &3·""5#7¸.# &;6/($8":¹"! )("\'#&\'#'),d('%3º""5%7»/I#3¼""5%7½./ &3¾""5"7¿.# &;6/($8":À"! )("\'#&\'#'),d('%3Á""5\'7Â/1#;/($8":Ã"! )("\'#&\'#'),d('%3Ä""5$7Å/1#;ï/($8":Æ"! )("\'#&\'#'),d('%3Ç""5&7È/1#;T/($8":É"! )("\'#&\'#'),d('%3Ê""5"7Ë/N#%2>""6>7?/,#;6/#$+")("\'#&\'#." &"/\'$8":Ì" )("\'#&\'#'),d('%;h/P#%2>""6>7?/,#;i/#$+")("\'#&\'#." &"/)$8":Í""! )("\'#&\'#'),d('%$;j/�#*;j&&&#/"!&,)'),d('%$;j/�#*;j&&&#/"!&,)'),d(";k.) &;+.# &;-"),d('2l""6l7m.e &2n""6n7o.Y &24""6475.M &28""6879.A &2<""6<7=.5 &2@""6@7A.) &2B""6B7C'),d('%26""6677/n#;m/e$$%2<""6<7=/,#;m/#$+")("\'#&\'#0<*%2<""6<7=/,#;m/#$+")("\'#&\'#&/#$+#)(#\'#("\'#&\'#'),d('%;n/A#2>""6>7?/2$;o/)$8#:Î#"" )(#\'#("\'#&\'#'),d("$;p.) &;+.# &;-/2#0/*;p.) &;+.# &;-&&&#"),d("$;p.) &;+.# &;-0/*;p.) &;+.# &;-&"),d('2l""6l7m.e &2n""6n7o.Y &24""6475.M &26""6677.A &28""6879.5 &2@""6@7A.) &2B""6B7C'),d(";.# &;r"),d("%;/G#;'/>$;s/5$;'/,$;„/#$+%)(%'#($'#(#'#(\"'#&'#"),d(";M.# &;t"),d("%;/E#28\"\"6879/6$;u.# &;x/'$8#:Ï# )(#'#(\"'#&'#"),d('%;v.# &;w/J#%26""6677/,#;ƒ/#$+")("\'#&\'#." &"/#$+")("\'#&\'#'),d('%2Ð""6Ð7Ñ/:#;€/1$;w." &"/#$+#)(#\'#("\'#&\'#'),d('%24""6475/,#;{/#$+")("\'#&\'#'),d("%;z/3#$;y0#*;y&/#$+\")(\"'#&'#"),d(";*.) &;+.# &;-"),d(';+. &;-.‰ &22""6273.} &26""6677.q &28""6879.e &2:""6:7;.Y &2<""6<7=.M &2>""6>7?.A &2@""6@7A.5 &2B""6B7C.) &2D""6D7E'),d('%;|/e#$%24""6475/,#;|/#$+")("\'#&\'#0<*%24""6475/,#;|/#$+")("\'#&\'#&/#$+")("\'#&\'#'),d('%$;~0#*;~&/e#$%22""6273/,#;}/#$+")("\'#&\'#0<*%22""6273/,#;}/#$+")("\'#&\'#&/#$+")("\'#&\'#'),d("$;~0#*;~&"),d(';+.w &;-.q &28""6879.e &2:""6:7;.Y &2<""6<7=.M &2>""6>7?.A &2@""6@7A.5 &2B""6B7C.) &2D""6D7E'),d('%%;"/‡#$;".G &;!.A &2@""6@7A.5 &2F""6F7G.) &2J""6J7K0M*;".G &;!.A &2@""6@7A.5 &2F""6F7G.) &2J""6J7K&/#$+")("\'#&\'#/& 8!:Ò! )'),d(";.# &;‚"),d('%%;O/2#2:""6:7;/#$+")("\'#&\'#." &"/,#;S/#$+")("\'#&\'#." &"'),d('$;+.ƒ &;-.} &2B""6B7C.q &2D""6D7E.e &22""6273.Y &28""6879.M &2:""6:7;.A &2<""6<7=.5 &2>""6>7?.) &2@""6@7A/Œ#0‰*;+.ƒ &;-.} &2B""6B7C.q &2D""6D7E.e &22""6273.Y &28""6879.M &2:""6:7;.A &2<""6<7=.5 &2>""6>7?.) &2@""6@7A&&&#'),d("$;y0#*;y&"),d('%3’""5#7Ó/q#24""6475/b$$;!/�#*;!&&&#/L$2J""6J7K/=$$;!/�#*;!&&&#/\'$8%:Ô% )(%\'#($\'#(#\'#("\'#&\'#'),d('2Õ""6Õ7Ö'),d('2×""6×7Ø'),d('2Ù""6Ù7Ú'),d('2Û""6Û7Ü'),d('2Ý""6Ý7Þ'),d('2ß""6ß7à'),d('2á""6á7â'),d('2ã""6ã7ä'),d('2å""6å7æ'),d('2ç""6ç7è'),d("%;….S &;†.M &;ˆ.G &;‰.A &;Š.; &;‹.5 &;Œ./ &;.) &;Ž.# &;6/& 8!:é! )"),d("%;„/G#;'/>$;‘/5$;'/,$;“/#$+%)(%'#($'#(#'#(\"'#&'#"),d("%;’/' 8!:ê!! )"),d("%;!/5#;!/,$;!/#$+#)(#'#(\"'#&'#"),d("%$;*.A &;+.; &;-.5 &;3./ &;4.) &;'.# &;(0G*;*.A &;+.; &;-.5 &;3./ &;4.) &;'.# &;(&/& 8!:ë! )"),d("%;µ/Y#$%;A/,#;µ/#$+\")(\"'#&'#06*%;A/,#;µ/#$+\")(\"'#&'#&/#$+\")(\"'#&'#"),d('%;9/N#%2:""6:7;/,#;9/#$+")("\'#&\'#." &"/\'$8":ì" )("\'#&\'#'),d("%;:.c &%;—/Y#$%;A/,#;—/#$+\")(\"'#&'#06*%;A/,#;—/#$+\")(\"'#&'#&/#$+\")(\"'#&'#/& 8!:í! )"),d("%;L.# &;˜/]#$%;B/,#;š/#$+\")(\"'#&'#06*%;B/,#;š/#$+\")(\"'#&'#&/'$8\":î\" )(\"'#&'#"),d("%;™.\" &\"/>#;@/5$;M/,$;?/#$+$)($'#(#'#(\"'#&'#"),d("%%;6/Y#$%;./,#;6/#$+\")(\"'#&'#06*%;./,#;6/#$+\")(\"'#&'#&/#$+\")(\"'#&'#.# &;H/' 8!:ï!! )"),d(";›.) &;œ.# &;Ÿ"),d("%3ð\"\"5!7ñ/:#;$;Î/5$;./,$;/#$+%)(%'#($'#(#'#(\"'#&'#"),d("%$;!/�#*;!&&&#/' 8!:ʼn!! )"),d("%;Ð/]#$%;A/,#;Ð/#$+\")(\"'#&'#06*%;A/,#;Ð/#$+\")(\"'#&'#&/'$8\":Ŋ\" )(\"'#&'#"),d("%;˜/]#$%;B/,#;Ÿ/#$+\")(\"'#&'#06*%;B/,#;Ÿ/#$+\")(\"'#&'#&/'$8\":ŋ\" )(\"'#&'#"),d('%;L.O &;˜.I &%;@." &"/:#;t/1$;?." &"/#$+#)(#\'#("\'#&\'#/]#$%;B/,#;Ÿ/#$+")("\'#&\'#06*%;B/,#;Ÿ/#$+")("\'#&\'#&/\'$8":Ō" )("\'#&\'#'),d("%;Ó/]#$%;B/,#;Ô/#$+\")(\"'#&'#06*%;B/,#;Ô/#$+\")(\"'#&'#&/'$8\":ō\" )(\"'#&'#"),d("%;•/& 8!:Ŏ! )"),d('%3ŏ""5(7Ő/:#;$;6/5$;;/,$;ë/#$+%)(%'#($'#(#'#(\"'#&'#"),d('%3’""5#7Ó.# &;6/\' 8!:Ɖ!! )'),d('%3±""5#7Ɗ.G &3³""5#7Ƌ.; &3·""5#7ƌ./ &3µ""5$7ƍ.# &;6/\' 8!:Ǝ!! )'),d('%;í/D#%;C/,#;î/#$+")("\'#&\'#." &"/#$+")("\'#&\'#'),d("%;U.) &;\\.# &;X/& 8!:Ə! )"),d('%%;!." &"/[#;!." &"/M$;!." &"/?$;!." &"/1$;!." &"/#$+%)(%\'#($\'#(#\'#("\'#&\'#/\' 8!:Ɛ!! )'),d('%%;!/?#;!." &"/1$;!." &"/#$+#)(#\'#("\'#&\'#/\' 8!:Ƒ!! )'),d(";½"),d('%;/^#$%;B/,#;ò/#$+")("\'#&\'#06*%;B/,#;ò/#$+")("\'#&\'#&/($8":ƒ"!!)("\'#&\'#'),d(";ó.# &;Ÿ"),d('%2Ɠ""6Ɠ7Ɣ/L#;""6>7?'),d('%;ÿ/b#28""6879/S$;ú/J$%2ơ""6ơ7Ƣ/,#;ë/#$+")("\'#&\'#." &"/#$+$)($\'#(#\'#("\'#&\'#'),d('%3ƣ""5%7Ƥ.) &3ƥ""5$7Ʀ/\' 8!:Ɵ!! )'),d('%;ë/O#3±""5#7².6 &3³""5#7´.* &$;+0#*;+&/\'$8":Ƨ" )("\'#&\'#'),d("%;ă/‡#2F\"\"6F7G/x$;Ă/o$2F\"\"6F7G/`$;Ă/W$2F\"\"6F7G/H$;Ă/?$2F\"\"6F7G/0$;Ą/'$8):ƨ) )()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#"),d("%;#/>#;#/5$;#/,$;#/#$+$)($'#(#'#(\"'#&'#"),d("%;Ă/,#;Ă/#$+\")(\"'#&'#"),d("%;Ă/5#;Ă/,$;Ă/#$+#)(#'#(\"'#&'#")],C=0,v=0,R=[{line:1,column:1}],A=0,y=[],I=0;if("startRule"in t){if(!(t.startRule in m))throw new Error("Can't start parsing from rule \""+t.startRule+'".');_=m[t.startRule]}if(t.data={},(f=p(_))!==T&&C===e.length)return f;throw f!==T&&C0){for(t=1,i=1;t-1&&r.indexOf("chrome")<0&&(n=!0);var o={};return n&&(o.modifiers=[e.WebRTC.Modifiers.stripG722]),this.ua=new e.UA({wsServers:this.options.ua.wsServers,uri:this.options.ua.uri,authorizationUser:this.options.ua.authorizationUser,password:this.options.ua.password,displayName:this.options.ua.displayName,traceSip:this.options.ua.traceSip,userAgentString:this.options.ua.userAgentString,register:!0,sessionDescriptionHandlerFactoryOptions:o}),this.state=i.STATUS_NULL,this.logger=this.ua.getLogger("sip.simple"),this.ua.on("registered",function(){this.emit("registered",this.ua)}.bind(this)),this.ua.on("unregistered",function(){this.emit("unregistered",this.ua)}.bind(this)),this.ua.on("failed",function(){this.emit("unregistered",this.ua)}.bind(this)),this.ua.on("invite",function(e){if(this.state!==i.STATUS_NULL&&this.state!==i.STATUS_COMPLETED)return this.logger.warn("Rejecting incoming call. Simple only supports 1 call at a time"),void e.reject();this.session=e,this.setupSession(),this.emit("ringing",this.session)}.bind(this)),this.ua.on("message",function(e){this.emit("message",e)}.bind(this)),this};return s.prototype=Object.create(e.EventEmitter.prototype),s.C=i,s.prototype.call=function(e){return this.ua&&this.ua.isRegistered()?this.state!==i.STATUS_NULL&&this.state!==i.STATUS_COMPLETED?void this.logger.warn("Cannot make more than a single call with Simple"):(this.options.media.remote.audio&&(this.options.media.remote.audio.autoplay=!0),this.options.media.remote.video&&(this.options.media.remote.video.autoplay=!0),this.options.media.local&&this.options.media.local.video&&(this.options.media.local.video.autoplay=!0,this.options.media.local.video.volume=0),this.session=this.ua.invite(e,{sessionDescriptionHandlerOptions:{constraints:{audio:this.audio,video:this.video}}}),this.setupSession(),this.session):void this.logger.warn("A registered UA is required for calling")},s.prototype.answer=function(){return this.state!==i.STATUS_NEW&&this.state!==i.STATUS_CONNECTING?void this.logger.warn("No call to answer"):(this.options.media.remote.audio&&(this.options.media.remote.audio.autoplay=!0),this.options.media.remote.video&&(this.options.media.remote.video.autoplay=!0),this.session.accept({sessionDescriptionHandlerOptions:{constraints:{audio:this.audio,video:this.video}}}))},s.prototype.reject=function(){return this.state!==i.STATUS_NEW&&this.state!==i.STATUS_CONNECTING?void this.logger.warn("Call is already answered"):this.session.reject()},s.prototype.hangup=function(){return this.state!==i.STATUS_CONNECTED&&this.state!==i.STATUS_CONNECTING&&this.state!==i.STATUS_NEW?void this.logger.warn("No active call to hang up on"):this.state!==i.STATUS_CONNECTED?this.session.cancel():this.session.bye()},s.prototype.hold=function(){return this.state!==i.STATUS_CONNECTED||this.session.isOnHold().local?void this.logger.warn("Cannot put call on hold"):(this.mute(),this.logger.log("Placing session on hold"),this.session.hold())},s.prototype.unhold=function(){return this.state===i.STATUS_CONNECTED&&this.session.isOnHold().local?(this.unmute(),this.logger.log("Placing call off hold"),this.session.unhold()):void this.logger.warn("Cannot unhold a call that is not on hold")},s.prototype.mute=function(){if(this.state!==i.STATUS_CONNECTED)return void this.logger.warn("An acitve call is required to mute audio");this.logger.log("Muting Audio"),this.toggleMute(!0)},s.prototype.unmute=function(){if(this.state!==i.STATUS_CONNECTED)return void this.logger.warn("An active call is required to unmute audio");this.logger.log("Unmuting Audio"),this.toggleMute(!1)},s.prototype.sendDTMF=function(e){if(this.state!==i.STATUS_CONNECTED)return void this.logger.warn("An active call is required to send a DTMF tone");this.logger.log("Sending DTMF tone: "+e),this.session.dtmf(e)},s.prototype.message=function(e,t){return this.ua&&this.ua.isRegistered()?e&&t?void this.ua.message(e,t):void this.logger.warn("A destination and message are required to send a message"):void this.logger.warn("A registered UA is required to send a message")},s.prototype.setupRemoteMedia=function(){var e,i=this.session.sessionDescriptionHandler.peerConnection;i.getRemoteStreams?e=i.getRemoteStreams()[0]:(e=new t.window.MediaStream,i.getReceivers().forEach(function(t){var i=t.track;i&&e.addTrack(i)})),this.video?(this.options.media.remote.video.srcObject=e,this.options.media.remote.video.play().catch(function(){this.logger.log("play was rejected")}.bind(this))):this.audio&&(this.options.media.remote.audio.srcObject=e,this.options.media.remote.audio.play().catch(function(){this.logger.log("play was rejected")}.bind(this)))},s.prototype.setupLocalMedia=function(){if(this.video&&this.options.media.local&&this.options.media.local.video){var e,i=this.session.sessionDescriptionHandler.peerConnection;i.getSenders?(e=new t.window.MediaStream,i.getSenders().forEach(function(t){var i=t.track;i&&"video"===i.kind&&e.addTrack(i)})):e=i.getLocalStreams()[0],this.options.media.local.video.srcObject=e,this.options.media.local.video.volume=0,this.options.media.local.video.play()}},s.prototype.cleanupMedia=function(){this.video&&(this.options.media.remote.video.srcObject=null,this.options.media.remote.video.pause(),this.options.media.local&&this.options.media.local.video&&(this.options.media.local.video.srcObject=null,this.options.media.local.video.pause())),this.audio&&(this.options.media.remote.audio.srcObject=null,this.options.media.remote.audio.pause())},s.prototype.setupSession=function(){this.state=i.STATUS_NEW,this.emit("new",this.session),this.session.on("progress",this.onProgress.bind(this)),this.session.on("accepted",this.onAccepted.bind(this)),this.session.on("rejected",this.onEnded.bind(this)),this.session.on("failed",this.onFailed.bind(this)),this.session.on("terminated",this.onEnded.bind(this))},s.prototype.destroyMedia=function(){this.session.sessionDescriptionHandler.close()},s.prototype.toggleMute=function(e){var t=this.session.sessionDescriptionHandler.peerConnection;t.getSenders?t.getSenders().forEach(function(t){t.track&&(t.track.enabled=!e)}):t.getLocalStreams().forEach(function(t){t.getAudioTracks().forEach(function(t){t.enabled=!e}),t.getVideoTracks().forEach(function(t){t.enabled=!e})})},s.prototype.onAccepted=function(){this.state=i.STATUS_CONNECTED,this.emit("connected",this.session),this.setupLocalMedia(),this.setupRemoteMedia(),this.session.sessionDescriptionHandler.on("addTrack",function(){this.logger.log("A track has been added, triggering new remoteMedia setup"),this.setupRemoteMedia()}.bind(this)),this.session.sessionDescriptionHandler.on("addStream",function(){this.logger.log("A stream has been added, trigger new remoteMedia setup"),this.setupRemoteMedia()}.bind(this)),this.session.on("hold",function(){this.emit("hold",this.session)}.bind(this)),this.session.on("unhold",function(){this.emit("unhold",this.session)}.bind(this)),this.session.on("dtmf",function(e){this.emit("dtmf",e)}.bind(this)),this.session.on("bye",this.onEnded.bind(this))},s.prototype.onProgress=function(){this.state=i.STATUS_CONNECTING,this.emit("connecting",this.session)},s.prototype.onFailed=function(){this.onEnded()},s.prototype.onEnded=function(){this.state=i.STATUS_COMPLETED,this.emit("ended",this.session),this.cleanupMedia()},s}}).call(t,i(0))},function(e,t,i){"use strict";(function(t){function s(e,t){if(null!=e){var i=t.charAt(0).toUpperCase()+t.slice(1),s=[t,"webkit"+i,"moz"+i];for(var r in s){var n=e[s[r]];if(n)return n.bind(e)}}}var r=t.window||t;e.exports={WebSocket:r.WebSocket,Transport:i(35),open:r.open,Promise:r.Promise,timers:r,console:r.console||{debug:function(){},log:function(){},warn:function(){},error:function(){}},addEventListener:s(r,"addEventListener"),removeEventListener:s(r,"removeEventListener")}}).call(t,i(0))},function(e,t,i){"use strict";e.exports=function(e,t){function i(e){var t=.8*e;return 1e3*(Math.random()*(e-t)+t)}var s,r={STATUS_READY:0,STATUS_DISCONNECTED:1,STATUS_ERROR:2};return s=function(e,t){this.logger=e.getLogger("sip.transport"),this.ua=e,this.ws=null,this.server=t,this.reconnection_attempts=0,this.closed=!1,this.connected=!1,this.reconnectTimer=null,this.lastTransportError={},this.keepAliveInterval=e.configuration.keepAliveInterval,this.keepAliveTimeout=null,this.keepAliveTimer=null,this.ua.transport=this,this.connect()},s.prototype={send:function(e){var i=e.toString();return this.ws&&this.ws.readyState===t.OPEN?(!0===this.ua.configuration.traceSip&&this.logger.log("sending WebSocket message:\n\n"+i+"\n"),this.ws.send(i),!0):(this.logger.warn("unable to send message, WebSocket is not open"),!1)},sendKeepAlive:function(){if(!this.keepAliveTimeout)return this.keepAliveTimeout=e.Timers.setTimeout(function(){this.ua.emit("keepAliveTimeout")}.bind(this),1e4),this.send("\r\n\r\n")},startSendingKeepAlives:function(){this.keepAliveInterval&&!this.keepAliveTimer&&(this.keepAliveTimer=e.Timers.setTimeout(function(){this.sendKeepAlive(),this.keepAliveTimer=null,this.startSendingKeepAlives()}.bind(this),i(this.keepAliveInterval)))},stopSendingKeepAlives:function(){e.Timers.clearTimeout(this.keepAliveTimer),e.Timers.clearTimeout(this.keepAliveTimeout),this.keepAliveTimer=null,this.keepAliveTimeout=null},disconnect:function(){this.ws&&(e.Timers.clearTimeout(this.reconnectTimer),this.stopSendingKeepAlives(),this.closed=!0,this.logger.log("closing WebSocket "+this.server.ws_uri),this.ws.close(),this.ws=null),null!==this.reconnectTimer&&(e.Timers.clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.ua.emit("disconnected",{transport:this,code:this.lastTransportError.code,reason:this.lastTransportError.reason}))},connect:function(){var e=this;if(this.ws&&(this.ws.readyState===t.OPEN||this.ws.readyState===t.CONNECTING))return this.logger.log("WebSocket "+this.server.ws_uri+" is already connected"),!1;this.ws&&(this.ws.close(),this.ws=null),this.logger.log("connecting to WebSocket "+this.server.ws_uri),this.ua.onTransportConnecting(this,0===this.reconnection_attempts?1:this.reconnection_attempts);try{this.ws=new t(this.server.ws_uri,"sip")}catch(e){this.logger.warn("error connecting to WebSocket "+this.server.ws_uri+": "+e)}this.ws.binaryType="arraybuffer",this.ws.onopen=function(){e.onOpen()},this.ws.onclose=function(t){e.onClose(t),this.onopen=null,this.onclose=null,this.onmessage=null,this.onerror=null},this.ws.onmessage=function(t){e.onMessage(t)},this.ws.onerror=function(t){e.onError(t)}},onOpen:function(){this.connected=!0,this.logger.log("WebSocket "+this.server.ws_uri+" connected"),null!==this.reconnectTimer&&(e.Timers.clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.reconnection_attempts=0,this.closed=!1,this.ua.onTransportConnected(this),this.startSendingKeepAlives()},onClose:function(e){var t=this.connected;this.lastTransportError.code=e.code,this.lastTransportError.reason=e.reason,this.stopSendingKeepAlives(),this.reconnection_attempts>0?(this.logger.log("Reconnection attempt "+this.reconnection_attempts+" failed (code: "+e.code+(e.reason?"| reason: "+e.reason:"")+")"),this.reconnect()):(this.connected=!1,this.logger.log("WebSocket disconnected (code: "+e.code+(e.reason?"| reason: "+e.reason:"")+")"),!1===e.wasClean&&this.logger.warn("WebSocket abrupt disconnection"),!0===t?(this.ua.onTransportClosed(this),this.closed?this.ua.emit("disconnected",{transport:this,code:this.lastTransportError.code,reason:this.lastTransportError.reason}):this.reconnect()):this.ua.onTransportError(this))},onMessage:function(t){var i,s,r=t.data;if("\r\n"===r)return e.Timers.clearTimeout(this.keepAliveTimeout),this.keepAliveTimeout=null,void(!0===this.ua.configuration.traceSip&&this.logger.log("received WebSocket message with CRLF Keep Alive response"));if("string"!=typeof r){try{r=String.fromCharCode.apply(null,new Uint8Array(r))}catch(e){return void this.logger.warn("received WebSocket binary message failed to be converted into string, message discarded")}!0===this.ua.configuration.traceSip&&this.logger.log("received WebSocket binary message:\n\n"+r+"\n")}else!0===this.ua.configuration.traceSip&&this.logger.log("received WebSocket text message:\n\n"+r+"\n");if((i=e.Parser.parseMessage(r,this.ua))&&!(this.ua.status===e.UA.C.STATUS_USER_CLOSED&&i instanceof e.IncomingRequest)&&e.sanityCheck(i,this.ua,this))if(i instanceof e.IncomingRequest)i.transport=this,this.ua.receiveRequest(i);else if(i instanceof e.IncomingResponse)switch(i.method){case e.C.INVITE:s=this.ua.transactions.ict[i.via_branch],s&&s.receiveResponse(i);break;case e.C.ACK:break;default:s=this.ua.transactions.nict[i.via_branch],s&&s.receiveResponse(i)}},onError:function(e){this.logger.warn("WebSocket connection error: "),this.logger.warn(e)},reconnect:function(){var t=this;this.reconnection_attempts+=1,this.reconnection_attempts>this.ua.configuration.wsServerMaxReconnection?(this.logger.warn("maximum reconnection attempts for WebSocket "+this.server.ws_uri),this.ua.onTransportError(this)):1===this.reconnection_attempts?(this.logger.log("Connection to WebSocket "+this.server.ws_uri+" severed, attempting first reconnect"),t.connect()):(this.logger.log("trying to reconnect to WebSocket "+this.server.ws_uri+" (reconnection attempt "+this.reconnection_attempts+")"),this.reconnectTimer=e.Timers.setTimeout(function(){t.connect(),t.reconnectTimer=null},1e3*this.ua.configuration.wsServerReconnectionTimeout))}},s.C=r,s}}])}); \ No newline at end of file diff --git a/voip_sip_webrtc/static/src/js/voip_system_tray.js b/voip_sip_webrtc/static/src/js/voip_system_tray.js new file mode 100644 index 000000000..421d62307 --- /dev/null +++ b/voip_sip_webrtc/static/src/js/voip_system_tray.js @@ -0,0 +1,103 @@ +odoo.define('voip_sip_webrtc.voip_system_tray', function (require) { +"use strict"; + +var core = require('web.core'); +var framework = require('web.framework'); +var odoo_session = require('web.session'); +var web_client = require('web.web_client'); +var Widget = require('web.Widget'); +var ajax = require('web.ajax'); +var bus = require('bus.bus').bus; +var Notification = require('web.notification').Notification; +var WebClient = require('web.WebClient'); +var SystrayMenu = require('web.SystrayMenu'); +var voip_notification = require('voip_sip_webrtc.voip_call_notification'); +var rpc = require('web.rpc'); +var weContext = require('web_editor.context'); + +var _t = core._t; +var qweb = core.qweb; + +var VOIPSystemTray = Widget.extend({ + template:'VoipSystemTray', + events: { + "click": "on_click", + "click .start_voip_audio_call": "start_voip_audio_call", + "click .start_voip_video_call": "start_voip_video_call", + "click .start_voip_screenshare_call": "start_voip_screenshare_call", + }, + on_click: function (event) { + event.preventDefault(); + + rpc.query({ + model: 'voip.server', + method: 'user_list', + args: [], + context: weContext.get() + }).then(function(result){ + + $("#voip_tray").html(""); + + for (var voip_user in result) { + var voip_user = result[voip_user]; + var drop_menu_html = ""; + + drop_menu_html += "

  • "; + drop_menu_html += " " + "" + voip_user.name + " (" + voip_user.status + ")" + " Video Call Audio Call Screenshare Call"; + drop_menu_html += "
  • "; + + $("#voip_tray").append(drop_menu_html); + + } + + }); + + }, + start_voip_screenshare_call: function (event) { + console.log("Call Type: screenshare call"); + + var role = "caller"; + var mode = "screensharing"; + var call_type = "internal"; + var to_partner_id = $(event.currentTarget).data("partner"); + + var voip_call_client = new voip_notification.VoipCallClient(role, mode, call_type, to_partner_id); + + var constraints = {'audio': true, 'video': {'mediaSource': "screen"}}; + voip_call_client.requestMediaAccess(constraints); + + }, + start_voip_audio_call: function (event) { + console.log("Call Type: audio call"); + + var role = "caller"; + var mode = "audiocall"; + var call_type = "internal"; + var to_partner_id = $(event.currentTarget).data("partner"); + + var voip_call_client = new voip_notification.VoipCallClient(role, mode, call_type, to_partner_id); + + var constraints = {'audio': true}; + voip_call_client.requestMediaAccess(constraints); + + + }, + start_voip_video_call: function (event) { + console.log("Call Type: video call"); + + var role = "caller"; + var mode = "videocall"; + var call_type = "internal"; + var to_partner_id = $(event.currentTarget).data("partner"); + + var voip_call_client = new voip_notification.VoipCallClient(role, mode, call_type, to_partner_id); + + var constraints = {'audio': true, 'video': true}; + voip_call_client.requestMediaAccess(constraints); + + }, +}); + +SystrayMenu.Items.push(VOIPSystemTray); + +}); \ No newline at end of file diff --git a/voip_sip_webrtc/static/src/xml/sip_widget.xml b/voip_sip_webrtc/static/src/xml/sip_widget.xml new file mode 100644 index 000000000..682dda7a6 --- /dev/null +++ b/voip_sip_webrtc/static/src/xml/sip_widget.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/voip_sip_webrtc/static/src/xml/voip_notification.xml b/voip_sip_webrtc/static/src/xml/voip_notification.xml new file mode 100644 index 000000000..4e359b3f1 --- /dev/null +++ b/voip_sip_webrtc/static/src/xml/voip_notification.xml @@ -0,0 +1,44 @@ + + diff --git a/voip_sip_webrtc/static/src/xml/voip_window.xml b/voip_sip_webrtc/static/src/xml/voip_window.xml new file mode 100644 index 000000000..a7fad615c --- /dev/null +++ b/voip_sip_webrtc/static/src/xml/voip_window.xml @@ -0,0 +1,30 @@ + + + + +
    +
    + + +

    Starting Call...

    +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    + + +
    + + + diff --git a/voip_sip_webrtc/views/ir_actions_server_views.xml b/voip_sip_webrtc/views/ir_actions_server_views.xml new file mode 100644 index 000000000..c6027ea5e --- /dev/null +++ b/voip_sip_webrtc/views/ir_actions_server_views.xml @@ -0,0 +1,28 @@ + + + + + + ir.actions.server.form.sms + ir.actions.server + + + + +

    + Please set the Base Model before setting the action details. +

    + + +

    + Choose a VOIP call template. +

    +
    +
    +
    +
    +
    + +
    +
    diff --git a/voip_sip_webrtc/views/menus.xml b/voip_sip_webrtc/views/menus.xml new file mode 100644 index 000000000..5f686d4ac --- /dev/null +++ b/voip_sip_webrtc/views/menus.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/voip_sip_webrtc/views/res_partner_views.xml b/voip_sip_webrtc/views/res_partner_views.xml new file mode 100644 index 000000000..43dc66e39 --- /dev/null +++ b/voip_sip_webrtc/views/res_partner_views.xml @@ -0,0 +1,30 @@ + + + + + SIP Message Partner + + + True + code + action = record.sip_action() + + + + res.partner SIP + res.partner + + + + + + + + + + + + + \ No newline at end of file diff --git a/voip_sip_webrtc/views/res_users_views.xml b/voip_sip_webrtc/views/res_users_views.xml new file mode 100644 index 000000000..c802d903c --- /dev/null +++ b/voip_sip_webrtc/views/res_users_views.xml @@ -0,0 +1,23 @@ + + + + + res.users Voip + res.users + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/voip_sip_webrtc/views/voip_account_views.xml b/voip_sip_webrtc/views/voip_account_views.xml new file mode 100644 index 000000000..224c4b744 --- /dev/null +++ b/voip_sip_webrtc/views/voip_account_views.xml @@ -0,0 +1,70 @@ + + + + + voip.account view form + voip.account + +
    +
    +
    + + + + + + + + + + + + + + + +
    +
    +
    + + + voip.account view tree + voip.account + + + + + + + + + + VOIP Accounts + voip.account + tree,form + +

    + No SIP Accounts +

    +
    +
    + + + voip.account.action form view + voip.account.action + +
    + + + + + + + +
    +
    +
    + +
    \ No newline at end of file diff --git a/voip_sip_webrtc/views/voip_call_template_preview_views.xml b/voip_sip_webrtc/views/voip_call_template_preview_views.xml new file mode 100644 index 000000000..dbdbb4004 --- /dev/null +++ b/voip_sip_webrtc/views/voip_call_template_preview_views.xml @@ -0,0 +1,27 @@ + + + + + voip.call.template.preview form view + voip.call.template.preview + +
    + + + + +
    \ No newline at end of file diff --git a/sms_frame/static/src/js/sms_widget.js b/sms_frame/static/src/js/sms_widget.js new file mode 100644 index 000000000..b29056ee8 --- /dev/null +++ b/sms_frame/static/src/js/sms_widget.js @@ -0,0 +1,69 @@ +openerp.sms_frame = function (instance, local){ +var _t = instance.web._t, + _lt = instance.web._lt; +var QWeb = instance.web.qweb; + +local.FieldChar2 = instance.web.form.AbstractField.extend({ + + init: function() { + this._super.apply(this, arguments); + this.set("value", ""); + }, + + start: function() { + this.on("change:effective_readonly", this, function() { + + this.display_field(); + this.render_value(); + }); + this.display_field(); + return this._super(); + }, + display_field: function() { + var self = this; + this.$el.html(QWeb.render("sms_widget", {widget: this})); + if (! this.get("effective_readonly")) { + this.$("input").change(function() { + self.internal_set_value(self.$("input").val()); + }); + } + }, + render_value: function() { + if (this.get("effective_readonly")) { + this.$el.html("" + this.get("value") + ""); + } else { + this.$("input").val(this.get("value")); + } + }, + + events: { + 'click':'item_click', + }, + + item_click:function (ev) { + ev.preventDefault(); + ev.stopPropagation(); + + if (this.get("effective_readonly")) { + + this.do_action({ + type:'ir.actions.act_window', + res_model:'sms.compose', + views: [[false,'form']], + target:'new', + context: {'default_field_id':this.name,'default_to_number':this.get("value"),'default_record_id':this.getParent().get_fields_values()['id'],'default_model_id':this.getParent().model}, + }); + + } + }, + + +}); + +instance.web.form.widgets.add('sms_frame', 'instance.sms_frame.FieldChar2'); + + + + + +}; \ No newline at end of file diff --git a/sms_frame/static/src/xml/sms_compose.xml b/sms_frame/static/src/xml/sms_compose.xml new file mode 100644 index 000000000..388ba1311 --- /dev/null +++ b/sms_frame/static/src/xml/sms_compose.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/sms_frame/static/src/xml/sms_widget.xml b/sms_frame/static/src/xml/sms_widget.xml new file mode 100644 index 000000000..074d52c41 --- /dev/null +++ b/sms_frame/static/src/xml/sms_widget.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/sms_frame/views/ir_actions_server_views.xml b/sms_frame/views/ir_actions_server_views.xml new file mode 100644 index 000000000..d264a234e --- /dev/null +++ b/sms_frame/views/ir_actions_server_views.xml @@ -0,0 +1,28 @@ + + + + + + ir.actions.server.form.sms + ir.actions.server + + + + +

    + Please set the Base Model before setting the action details. +

    + + +

    + Choose a SMS template. +

    +
    +
    +
    +
    +
    + +
    +
    diff --git a/sms_frame/views/ir_actions_todo.xml b/sms_frame/views/ir_actions_todo.xml new file mode 100644 index 000000000..6679a7a43 --- /dev/null +++ b/sms_frame/views/ir_actions_todo.xml @@ -0,0 +1,25 @@ + + + + + + + + SMS Account Twilio + sms.account + form + tree,form + + + +

    Add SMS Gateway Accounts

    +
    +
    + + + + open + + +
    +
    \ No newline at end of file diff --git a/sms_frame/views/qweb.xml b/sms_frame/views/qweb.xml new file mode 100644 index 000000000..806675fcc --- /dev/null +++ b/sms_frame/views/qweb.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/sms_frame/views/res_partner_views.xml b/sms_frame/views/res_partner_views.xml new file mode 100644 index 000000000..9d6e3c744 --- /dev/null +++ b/sms_frame/views/res_partner_views.xml @@ -0,0 +1,26 @@ + + + + + + SMS Partner + + + True + code + action = record.sms_action() + + + + E.164 mobile placeholder + res.partner + + + + + + + + + + \ No newline at end of file diff --git a/sms_frame/views/sms_account_views.xml b/sms_frame/views/sms_account_views.xml new file mode 100644 index 000000000..09d09f81a --- /dev/null +++ b/sms_frame/views/sms_account_views.xml @@ -0,0 +1,62 @@ + + + + + + sms.account.view.form + sms.account + +
    + + + + + +

    Gateway Settings

    +
    +
    +
    + + + sms.account.view.tree + sms.account + + + + + + + + + + SMS Gateway Account + sms.account + form + tree,form + +

    Add SMS Gateway Accounts

    +
    +
    + + + sms.account.view.form + sms.account + + + +
    + + + + +
    +
    +
    +
    + + + +
    +
    \ No newline at end of file diff --git a/sms_frame/views/sms_compose_views.xml b/sms_frame/views/sms_compose_views.xml new file mode 100644 index 000000000..b6851a828 --- /dev/null +++ b/sms_frame/views/sms_compose_views.xml @@ -0,0 +1,30 @@ + + + + + + sms.compose.view.form + sms.compose + +
    + + + + + + + + + + + + +
    +
    +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/sms_frame/views/sms_message_views.xml b/sms_frame/views/sms_message_views.xml new file mode 100644 index 000000000..70b89b73a --- /dev/null +++ b/sms_frame/views/sms_message_views.xml @@ -0,0 +1,108 @@ + + + + + + sms.message.view.form + sms.message + +
    + + + + + + + + + + + + + + + + +
    +
    +
    + + + sms.message.view.tree + sms.message + + + + + + + + + + + + + + + + + sms.message.view.kanban + sms.message + + + + + + + + + + + + + + + + + + SMS / MMS Messages + sms.message + form + kanban,tree,form + +

    SMS Messages

    +
    +
    + + + +
    +
    \ No newline at end of file diff --git a/sms_frame/views/sms_number_views.xml b/sms_frame/views/sms_number_views.xml new file mode 100644 index 000000000..c0ad45c65 --- /dev/null +++ b/sms_frame/views/sms_number_views.xml @@ -0,0 +1,46 @@ + + + + + + esms stored_numbers form view + sms.number + +
    + + + + + +
    +
    +
    + + + esms stored_number tree view + sms.number + + + + + + + + + + + SMS stored number + sms.number + form + tree,form + +

    + List of stored mobile numbers. +

    +
    +
    + + + +
    +
    \ No newline at end of file diff --git a/sms_frame/views/sms_template_views.xml b/sms_frame/views/sms_template_views.xml new file mode 100644 index 000000000..04bd47395 --- /dev/null +++ b/sms_frame/views/sms_template_views.xml @@ -0,0 +1,68 @@ + + + + + sms.template.view.form + sms.template + +
    + +
    +
    + + + + + + + + + + + + + + +
    +
    +
    +
    + + + sms.template.view.tree + sms.template + + + + + + + + + + + + SMS/MMS Templates + sms.template + form + tree,form + +

    Create an SMS template

    +
    +
    + + + +
    +
    \ No newline at end of file diff --git a/sms_frame/views/sms_views.xml b/sms_frame/views/sms_views.xml new file mode 100644 index 000000000..0e4b540e1 --- /dev/null +++ b/sms_frame/views/sms_views.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file From 4189a557cd7c22931fddeb8ee8ffad5fb6ff4de1 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Mon, 26 Mar 2018 10:54:44 +1100 Subject: [PATCH 023/228] quick port to version 11 quick port to version 11 --- voip_sip_webrtc_twilio_bill/__init__.py | 4 + voip_sip_webrtc_twilio_bill/__manifest__.py | 23 + .../controllers/__init__.py | 3 + .../controllers/main.py | 28 ++ voip_sip_webrtc_twilio_bill/doc/changelog.rst | 3 + .../models/__init__.py | 5 + .../models/res_partner.py | 48 ++ .../models/voip_call.py | 442 ++++++++++++++++++ .../models/voip_twilio.py | 332 +++++++++++++ .../security/ir.model.access.csv | 3 + .../static/description/1.jpg | Bin 0 -> 56129 bytes .../static/description/2.jpg | Bin 0 -> 45001 bytes .../static/description/icon.png | Bin 0 -> 1373 bytes .../static/description/index.html | 15 + .../views/res_partner_views.xml | 18 + .../views/voip_call_views.xml | 70 +++ .../voip_sip_webrtc_twilio_bill_templates.xml | 23 + .../views/voip_twilio_invoice_views.xml | 28 ++ .../views/voip_twilio_views.xml | 53 +++ 19 files changed, 1098 insertions(+) create mode 100644 voip_sip_webrtc_twilio_bill/__init__.py create mode 100644 voip_sip_webrtc_twilio_bill/__manifest__.py create mode 100644 voip_sip_webrtc_twilio_bill/controllers/__init__.py create mode 100644 voip_sip_webrtc_twilio_bill/controllers/main.py create mode 100644 voip_sip_webrtc_twilio_bill/doc/changelog.rst create mode 100644 voip_sip_webrtc_twilio_bill/models/__init__.py create mode 100644 voip_sip_webrtc_twilio_bill/models/res_partner.py create mode 100644 voip_sip_webrtc_twilio_bill/models/voip_call.py create mode 100644 voip_sip_webrtc_twilio_bill/models/voip_twilio.py create mode 100644 voip_sip_webrtc_twilio_bill/security/ir.model.access.csv create mode 100644 voip_sip_webrtc_twilio_bill/static/description/1.jpg create mode 100644 voip_sip_webrtc_twilio_bill/static/description/2.jpg create mode 100644 voip_sip_webrtc_twilio_bill/static/description/icon.png create mode 100644 voip_sip_webrtc_twilio_bill/static/description/index.html create mode 100644 voip_sip_webrtc_twilio_bill/views/res_partner_views.xml create mode 100644 voip_sip_webrtc_twilio_bill/views/voip_call_views.xml create mode 100644 voip_sip_webrtc_twilio_bill/views/voip_sip_webrtc_twilio_bill_templates.xml create mode 100644 voip_sip_webrtc_twilio_bill/views/voip_twilio_invoice_views.xml create mode 100644 voip_sip_webrtc_twilio_bill/views/voip_twilio_views.xml diff --git a/voip_sip_webrtc_twilio_bill/__init__.py b/voip_sip_webrtc_twilio_bill/__init__.py new file mode 100644 index 000000000..e89927ca6 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import controllers \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/__manifest__.py b/voip_sip_webrtc_twilio_bill/__manifest__.py new file mode 100644 index 000000000..1db8da4ae --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/__manifest__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Voip Communication - Twilio Bill", + 'version': "1.0", + 'author': "Sythil Tech", + 'category': "Tools", + 'support': "steven@sythiltech.com.au", + 'summary': "Add support for Twilio XML", + 'license':'LGPL-3', + 'data': [ + 'views/voip_call_views.xml', + 'views/voip_twilio_invoice_views.xml', + 'views/voip_twilio_views.xml', + 'views/res_partner_views.xml', + 'views/voip_sip_webrtc_twilio_bill_templates.xml', + 'security/ir.model.access.csv', + ], + 'demo': [], + 'depends': ['crm','account'], + 'images':[ + ], + 'installable': True, +} \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/controllers/__init__.py b/voip_sip_webrtc_twilio_bill/controllers/__init__.py new file mode 100644 index 000000000..6920e2020 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import main \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/controllers/main.py b/voip_sip_webrtc_twilio_bill/controllers/main.py new file mode 100644 index 000000000..87dabc411 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/controllers/main.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +import openerp.http as http +import werkzeug + +import logging +_logger = logging.getLogger(__name__) + +class TwilioVoiceController(http.Controller): + + @http.route('/twilio/voice', type='http', auth="public", csrf=False) + def twilio_voice(self, **kwargs): + + values = {} + for field_name, field_value in kwargs.items(): + values[field_name] = field_value + + from_sip = values['From'] + to_sip = values['To'] + + twilio_xml = "" + twilio_xml += '' + "\n" + twilio_xml += "\n" + twilio_xml += " \n" + twilio_xml += " " + to_sip + ";region=gll\n" + twilio_xml += " \n" + twilio_xml += "" + + return twilio_xml \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/doc/changelog.rst b/voip_sip_webrtc_twilio_bill/doc/changelog.rst new file mode 100644 index 000000000..f428dba03 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/doc/changelog.rst @@ -0,0 +1,3 @@ +v1.0 +==== +* Port to version 11 \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/models/__init__.py b/voip_sip_webrtc_twilio_bill/models/__init__.py new file mode 100644 index 000000000..3f334b58e --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from . import voip_twilio +from . import voip_call +from . import res_partner \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/models/res_partner.py b/voip_sip_webrtc_twilio_bill/models/res_partner.py new file mode 100644 index 000000000..453f7f0e4 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/models/res_partner.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +from openerp import api, fields, models +from openerp.exceptions import UserError + +class ResPartnerVoip(models.Model): + + _inherit = "res.partner" + + sip_address = fields.Char(string="SIP Address") + xmpp_address = fields.Char(string="XMPP Address") + + @api.onchange('country_id','mobile') + def _onchange_mobile(self): + """Tries to convert a local number to e.164 format based on the partners country, don't change if already in e164 format""" + if self.mobile: + + if self.country_id and self.country_id.phone_code: + if self.mobile.startswith("0"): + self.mobile = "+" + str(self.country_id.phone_code) + self.mobile[1:].replace(" ","") + elif self.mobile.startswith("+"): + self.mobile = self.mobile.replace(" ","") + else: + self.mobile = "+" + str(self.country_id.phone_code) + self.mobile.replace(" ","") + else: + self.mobile = self.mobile.replace(" ","") + + @api.multi + def sip_action(self): + self.ensure_one() + + my_context = {'default_type': 'sip', 'default_model':'res.partner', 'default_record_id':self.id, 'default_to_address': self.sip_address} + + #Use the first SIP account you find + default_voip_account = self.env['voip.account'].search([]) + if default_voip_account: + my_context['default_sip_account_id'] = default_voip_account[0].id + else: + raise UserError("No SIP accounts found, can not send message") + + return { + 'name': 'SIP Compose', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'voip.message.compose', + 'target': 'new', + 'type': 'ir.actions.act_window', + 'context': my_context + } \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/models/voip_call.py b/voip_sip_webrtc_twilio_bill/models/voip_call.py new file mode 100644 index 000000000..0a584c495 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/models/voip_call.py @@ -0,0 +1,442 @@ +# -*- coding: utf-8 -*- +from openerp.http import request +import datetime +import logging +import socket +import threading +_logger = logging.getLogger(__name__) +import time +from random import randint +from hashlib import sha1 +import ssl +#from dtls import do_patch +#from dtls.sslconnection import SSLConnection +import hmac +import hashlib +import random +import string +import passlib +import struct +import zlib +import re +from openerp.exceptions import UserError +import binascii +from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT +from openerp import api, fields, models + +class VoipCall(models.Model): + + _name = "voip.call" + _order = 'create_date desc' + + from_address = fields.Char(string="From Address") + from_partner_id = fields.Many2one('res.partner', string="From Partner", help="From can be blank if the call comes from outside of the system") + from_partner_sdp = fields.Text(string="From Partner SDP") + partner_id = fields.Many2one('res.partner', string="(OBSOLETE)To Partner") + to_address = fields.Char(string="To Address") + to_partner_id = fields.Many2one('res.partner', string="To Partner", help="To partner can be blank if the source is external and no record with mobile or sip is found") + status = fields.Selection([('pending','Pending'), ('missed','Missed'), ('accepted','Accepted'), ('rejected','Rejected'), ('active','Active'), ('over','Complete'), ('failed','Failed'), ('busy','Busy'), ('cancelled','Cancelled')], string='Status', default="pending", help="Pending = Calling person\nActive = currently talking\nMissed = Call timed out\nOver = Someone hit end call\nRejected = Someone didn't want to answer the call") + ring_time = fields.Datetime(string="Ring Time", help="Time the call starts dialing") + start_time = fields.Datetime(string="Start Time", help="Time the call was answered (if answered)") + end_time = fields.Datetime(string="End Time", help="Time the call end") + duration = fields.Char(string="Duration", help="Length of the call") + transcription = fields.Text(string="Transcription", help="Automatic transcription of the call") + notes = fields.Text(string="(OBSOLETE)Notes", help="Additional comments outside the transcription (use the chatter instead of this field)") + client_ids = fields.One2many('voip.call.client', 'vc_id', string="Client List") + type = fields.Selection([('internal','Internal'),('external','External')], string="Type") + mode = fields.Selection([('videocall','video call'), ('audiocall','audio call'), ('screensharing','screen sharing call')], string="Mode", help="This is only how the call starts, i.e a video call can turn into a screen sharing call mid way") + sip_tag = fields.Char(string="SIP Tag") + voip_account = fields.Many2one('voip.account', string="VOIP Account") + to_audio = fields.Binary(string="Audio") + to_audio_filename = fields.Char(string="(OBSOLETE)Audio Filename") + media = fields.Binary(string="Media") + media_filename = fields.Char(string="Media Filename") + server_stream_data = fields.Binary(string="Server Stream Data", help="Stream data sent by the server, e.g. automated call") + media_url = fields.Char(string="Media URL", compute="_compute_media_url") + codec_id = fields.Many2one('voip.codec', string="Codec") + direction = fields.Selection([('internal','Internal'), ('incoming','Incoming'), ('outgoing','Outgoing')], string="Direction") + sip_call_id = fields.Char(string="SIP Call ID") + ice_username = fields.Char(string="ICE Username") + ice_password = fields.Char(string="ICE Password") + twilio_sid = fields.Char(string="Twilio SID") + twilio_account_id = fields.Many2one('voip.twilio', string="Twilio Account") + currency_id = fields.Many2one('res.currency', string="Currency") + price = fields.Float(string="Price") + margin = fields.Float(string="Margin") + + @api.one + def _compute_media_url(self): + if self.media: + self.media_url = "/voip/messagebank/" + str(self.id) + else: + self.media_url = "" + + @api.model + def clear_messagebank(self): + """ Delete recorded phone call to clear up space """ + + for voip_call in self.env['voip.call'].search([('to_audio','!=', False)]): + #TODO remove to_audio + voip_call.to_audio = False + voip_call.to_audio_filename = False + + voip_call.server_stream_data = False + + voip_call.media = False + voip_call.media_filename = False + + #Also remove the media attached to the client + for voip_client in self.env['voip.call.client'].search([('audio_stream','!=', False)]): + voip_client.audio_stream = False + + def start_call(self): + """ Process the ICE queue now """ + + #Notify caller and callee that the call was rejected + for voip_client in self.client_ids: + notification = {'call_id': self.id} + self.env['bus.bus'].sendone((request._cr.dbname, 'voip.start', voip_client.partner_id.id), notification) + + def accept_call(self): + """ Mark the call as accepted and send response to close the notification window and open the VOIP window """ + + if self.status == "pending": + self.status = "accepted" + + #Notify caller and callee that the call was accepted + for voip_client in self.client_ids: + notification = {'call_id': self.id, 'status': 'accepted', 'type': self.type} + self.env['bus.bus'].sendone((request._cr.dbname, 'voip.response', voip_client.partner_id.id), notification) + + def reject_call(self): + """ Mark the call as rejected and send the response so the notification window is closed on both ends """ + + if self.status == "pending": + self.status = "rejected" + + #Notify caller and callee that the call was rejected + for voip_client in self.client_ids: + notification = {'call_id': self.id, 'status': 'rejected'} + self.env['bus.bus'].sendone((request._cr.dbname, 'voip.response', voip_client.partner_id.id), notification) + + def miss_call(self): + """ Mark the call as missed, both caller and callee will close there notification window due to the timeout """ + + if self.status == "pending": + self.status = "missed" + + def begin_call(self): + """ Mark the call as active, we start recording the call duration at this point """ + + if self.status == "accepted": + self.status = "active" + + self.start_time = datetime.datetime.now() + + def end_call(self): + """ Mark the call as over, we can calculate the call duration based on the start time, also send notification to both sides to close there VOIP windows """ + + if self.status == "active": + self.status = "over" + + self.end_time = datetime.datetime.now() + diff_time = datetime.datetime.strptime(self.end_time, DEFAULT_SERVER_DATETIME_FORMAT) - datetime.datetime.strptime(self.start_time, DEFAULT_SERVER_DATETIME_FORMAT) + self.duration = str(diff_time.seconds) + " Seconds" + + #Notify both caller and callee that the call is ended + for voip_client in self.client_ids: + notification = {'call_id': self.id} + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.end', voip_client.partner_id.id), notification) + + def voip_call_sdp(self, sdp): + """Store the description and send it to everyone else""" + + if self.type == "internal": + for voip_client in self.client_ids: + if voip_client.partner_id.id == self.env.user.partner_id.id: + voip_client.sdp = sdp + else: + notification = {'call_id': self.id, 'sdp': sdp } + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.sdp', voip_client.partner_id.id), notification) + + def generate_call_sdp(self): + + sdp_response = "" + + #Protocol Version ("v=") https://tools.ietf.org/html/rfc4566#section-5.1 (always 0 for us) + sdp_response += "v=0\r\n" + + #Origin ("o=") https://tools.ietf.org/html/rfc4566#section-5.2 (Should come up with a better session id...) + sess_id = int(time.time()) #Not perfect but I don't expect more then one call a second + sess_version = 0 #Will always start at 0 + sdp_response += "o=- " + str(sess_id) + " " + str(sess_version) + " IN IP4 0.0.0.0\r\n" + + #Session Name ("s=") https://tools.ietf.org/html/rfc4566#section-5.3 (We don't need a session name, information about the call is all displayed in the UI) + sdp_response += "s= \r\n" + + #Timing ("t=") https://tools.ietf.org/html/rfc4566#section-5.9 (For now sessions are infinite but we may use this if for example a company charges a price for a fixed 30 minute consultation) + sdp_response += "t=0 0\r\n" + + #In later versions we might send the missed call mp3 via rtp + sdp_response += "a=sendrecv\r\n" + + #TODO generate cert/fingerprint within module + fignerprint = self.env['ir.values'].get_default('voip.settings', 'fingerprint') + sdp_response += "a=fingerprint:sha-256 " + fignerprint + "\r\n" + sdp_response += "a=setup:passive\r\n" + + #Sure why not + sdp_response += "a=ice-options:trickle\r\n" + + #Sigh no idea + sdp_response += "a=msid-semantic:WMS *\r\n" + + #Random stuff, left here so I don't have get it a second time if needed + #example supported audio profiles: 109 9 0 8 101 + #sdp_response += "m=audio 9 UDP/TLS/RTP/SAVPF 109 101\r\n" + + #Media Descriptions ("m=") https://tools.ietf.org/html/rfc4566#section-5.14 (Message bank is audio only for now) + audio_codec = "9" #Use G722 Audio Profile + sdp_response += "m=audio 9 UDP/TLS/RTP/SAVPF " + audio_codec + "\r\n" + + #Connection Data ("c=") https://tools.ietf.org/html/rfc4566#section-5.7 (always seems to be 0.0.0.0?) + sdp_response += "c=IN IP4 0.0.0.0\r\n" + + #ICE creds (https://tools.ietf.org/html/rfc5245#page-76) + ice_ufrag = ''.join(random.choice('123456789abcdef') for _ in range(4)) + ice_pwd = ''.join(random.choice('123456789abcdef') for _ in range(22)) + self.ice_password = ice_pwd + sdp_response += "a=ice-ufrag:" + str(ice_ufrag) + "\r\n" + sdp_response += "a=ice-pwd:" + str(ice_pwd) + "\r\n" + + #Ummm naming each media?!? + sdp_response += "a=mid:sdparta_0\r\n" + + return {"type":"answer","sdp": sdp_response} + + def message_bank(self, sdp): + + _logger.error("Message Bank") + + #Ideally an integrity check should be done to ensure binding requests are valid, this is particiularly an issue for http since the random port can be sniffed. + #result = re.search('\r\na=ice-pwd:(.*)\r\n', sdp['sdp']) + #ice_password = result.group(1) + + server_sdp = self.generate_call_sdp() + + notification = {'call_id': self.id, 'sdp': server_sdp } + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.sdp', self.from_partner_id.id), notification) + + #RTP + #port = 62382 + #Random even number + port = randint(16384 /2, 32767 / 2) * 2 + server_ice_candidate = self.env['voip.server'].generate_server_ice(port, 1) + self.start_rtc_listener(port, "RTP") + notification = {'call_id': self.id, 'ice': server_ice_candidate } + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.ice', self.from_partner_id.id), notification) + + #RTCP + port += 1 + server_ice_candidate = self.env['voip.server'].generate_server_ice(port, 2) + self.start_rtc_listener(port, "RTCP") + notification = {'call_id': self.id, 'ice': server_ice_candidate } + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.ice', self.from_partner_id.id), notification) + + def voip_call_ice(self, ice): + """Forward ICE to everyone else""" + + for voip_client in self.client_ids: + + #Don't send ICE back to yourself + if voip_client.partner_id.id != self.env.user.partner_id.id: + notification = {'call_id': self.id, 'ice': ice } + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.ice', voip_client.partner_id.id), notification) + + def close_message_bank(self): + + #Notify the caller that the call is ended due to message bank timeout + notification = {'call_id': self.id} + self.env['bus.bus'].sendone((self._cr.dbname, 'voip.end', self.from_partner_id.id), notification) + + #TODO trancode G722 to a format that can be listened to within a browser + + #TODO save the transcoded file to the call so it can be listened to later (Only keep for 48 hours to save space also legal requirements in some places) + + def webrtc_dtls_handshake(self): + #Stage 2 DTLS + _logger.error("DTLS INCOMPLETE") + + def rtp_stun_listener(self, d, client_ip, port): + + if d[1] == "00" and d[2] == "01": + message_type = "Binding Request" + + message_length = int( d[3] + d[4], 16) + message_cookie = ' '.join(d[5:9]) + transaction_id = ' '.join(d[9:21]) + + #----Compose binding request----- + send_data = "" + + #Message Type (Binding Success Response) + send_data += "01 01" + + #Message Length (In this controlled environment it will always be 44) + send_data += " 00 2C" + + #Magic Cookie (always set to 0x2112A442) + send_data += " 21 12 a4 42" + + #96 bit (12 byte) transaction ID (has to be the same as the bind request) + send_data += transaction_id + + #XOR mapped address attribute + send_data += " 00 20" + + #Attribute Length (fixed 8 for IPv4, IPv6 will increase this) + send_data += " 00 08" + + #Reservered (reserved for what...) + send_data += " 00" + + #Protocol Family (Always IPv4 for now...) + send_data += " 01" + + #Port XOR + client_port = port + send_data += " " + format( client_port ^ 0x2112 , '04x') + + #IP XOR-d + client_ip_int = struct.unpack("!I", socket.inet_aton(client_ip))[0] + send_data += " " + format( client_ip_int ^ 0x2112A442 , '08x') + + #Cut off header + hmac_input = send_data.replace(" ","")[8:] + + #Readd header but subtract 8 from length before calculating hmac + hmac_input = "01010024" + hmac_input + + stun_password = self.ice_password + + key = passlib.utils.saslprep( stun_password ) + + mess_hmac = hmac.new( str(key), msg=hmac_input.decode("hex"), digestmod=hashlib.sha1).digest().encode('hex') + + #Message Integrity Attribute + send_data += " 00 08" + + #Attribute Length (Always 20 bytes) + send_data += " 00 14" + + #HMAC-SHA1 + send_data += mess_hmac + + crc32_int = binascii.crc32( binascii.a2b_hex( send_data.replace(" ","") ) ) % (1<<32) + crc_hex = format( crc32_int ^ 0x5354554e, '08x') + + #Fingerprint Attribute + send_data += " 80 28" + + #Atrribute Length (CRC-32 is always 4 bytes) + send_data += " 00 04" + + #Fingerprint + send_data += " " + crc_hex + + #Ok now convert it back so we can send it + return send_data.replace(" ","").decode('hex') + + def rtp_server_listener(self, port, message_bank_duration): + + #First Message we get is the conectivity test (STUN Binding Request User) + + #Second is DTLSv1.2 or more specifically dtls-strp + + #3rd is the stream with the G722 Audio payload + + _logger.error("Start RTP Listening on Port " + str(port) ) + + stunsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + stunsocket.bind(('', port)); + + start = time.time() + stage = "STUN" + hex_string = "" + + #Code is easier to understand if we start at 1 rather then 0... + hex_data = ['FF'] + + #Stage 1 STUN Connectivity Test + while stage == "STUN" or stage == "DTLS HELLO": + + data, addr = stunsocket.recvfrom(2048) + + #Convert to hex so we can human interpret each byte + for rtp_char in data: + hex_format = "{0:02x}".format(ord(rtp_char)) + hex_data.append(hex_format) + hex_string += hex_format + " " + + _logger.error("HEX DATA: " + hex_string) + + if stage == "STUN": + send_data = self.rtp_stun_listener(hex_data, addr[0], port) + stunsocket.sendto(send_data, addr ) + #We don't get any acknowledgement so we just assume everything went fine... + stage = "DTLS HELLO" + else: + send_data = self.webrtc_dtls_handshake() + stunsocket.sendto(send_data, addr ) + stage = "DTLS CIPHER" + + _logger.error("DTLS Stage") + + #Stage 2 DTLS (TODO) + + #End the call and do any post call processing + with api.Environment.manage(): + # As this function is in a new thread, i need to open a new cursor, because the old one may be closed + new_cr = self.pool.cursor() + self = self.with_env(self.env(cr=new_cr)) + + self.close_message_bank() + + #Have to manually commit the new cursor? + self.env.cr.commit() + + self._cr.close() + + _logger.error("END MESSAGE BANK") + + def start_rtc_listener(self, port, mode): + + message_bank_duration = self.env['ir.values'].get_default('voip.settings', 'message_bank_duration') + + #Start a new thread so you don't block the main Odoo thread + if mode is "RTP": + rtc_listener_starter = threading.Thread(target=self.rtp_server_listener, args=(port,message_bank_duration,)) + rtc_listener_starter.start() + elif mode is "RTCP": + #For now we don't use RTCP... + rtc_listener_starter = threading.Thread(target=self.rtp_server_listener, args=(port,message_bank_duration,)) + rtc_listener_starter.start() + +class VoipCallClient(models.Model): + + _name = "voip.call.client" + + vc_id = fields.Many2one('voip.call', string="VOIP Call") + partner_id = fields.Many2one('res.partner', string="Partner") + sip_address = fields.Char(string="SIP Address") + name = fields.Char(string="Name", help="Can be a number if the client is from outside the system") + model = fields.Char(string="Model") + record_id = fields.Integer(string="Record ID") + state = fields.Selection([('invited','Invited'),('joined','joined'),('media_access','Media Access')], string="State", default="invited") + sdp = fields.Char(string="SDP") + sip_invite = fields.Char(string="SIP INVITE Message") + sip_addr = fields.Char(string="Address") + sip_addr_host = fields.Char(string="SIP Address Host") + sip_addr_port = fields.Char(string="SIP Address Port") + audio_media_port = fields.Integer(string="Audio Media Port") + audio_stream = fields.Binary(string="Audio Stream") \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/models/voip_twilio.py b/voip_sip_webrtc_twilio_bill/models/voip_twilio.py new file mode 100644 index 000000000..eda37d8bf --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/models/voip_twilio.py @@ -0,0 +1,332 @@ +# -*- coding: utf-8 -*- +import logging +_logger = logging.getLogger(__name__) +import json +import requests +from datetime import datetime, timedelta +import re +from odoo.exceptions import UserError +from dateutil import parser + +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT +from openerp import api, fields, models + +class VoipTwilio(models.Model): + + _name = "voip.twilio" + _description = "Twilio Account" + + name = fields.Char(string="Name") + twilio_account_sid = fields.Char(string="Account SID") + twilio_auth_token = fields.Char(string="Auth Token") + twilio_last_check_date = fields.Datetime(string="Last Check Date") + resell_account = fields.Boolean(string="Resell Account") + margin = fields.Float(string="Margin", default="1.1", help="Multiply the call price by this figure 0.7 * 1.1 = 0.77") + partner_id = fields.Many2one('res.partner', string="Customer") + + @api.multi + def create_invoice(self): + self.ensure_one() + + if self.partner_id.id == False: + raise UserError("Please select a contact before creating the invoice") + return False + + return { + 'name': 'Twilio Create Invoice', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'voip.twilio.invoice', + 'target': 'new', + 'type': 'ir.actions.act_window', + 'context': {'default_twilio_account_id': self.id, 'default_margin': self.margin, 'default_end_date': datetime.now().strftime(DEFAULT_SERVER_DATE_FORMAT), 'default_start_date': (datetime.now() - timedelta(days=30)).strftime(DEFAULT_SERVER_DATE_FORMAT) } + } + + def fetch_call_history(self): + + payload = {} + if self.twilio_last_check_date: + my_time = datetime.strptime(self.twilio_last_check_date,'%Y-%m-%d %H:%M:%S') + response_string = requests.get("https://api.twilio.com/2010-04-01/Accounts/" + self.twilio_account_sid + "/Calls.json?StartTime%3E=" + my_time.strftime('%Y-%m-%d'), auth=(str(self.twilio_account_sid), str(self.twilio_auth_token))) + else: + response_string = requests.get("https://api.twilio.com/2010-04-01/Accounts/" + self.twilio_account_sid + "/Calls.json", auth=(str(self.twilio_account_sid), str(self.twilio_auth_token))) + + json_call_list = json.loads(response_string.text) + + _logger.error(response_string.text) + + if 'calls' not in json_call_list: + raise UserError(response_string.text) + + for call in json_call_list['calls']: + + #Don't reimport the same record + if self.env['voip.call'].search([('twilio_sid','=',call['sid'])]): + continue + + from_partner = False + from_address = call['from'] + to_address = call['to'] + to_address = to_address.replace("sip:","") + to_partner = False + create_dict = {} + + create_dict['twilio_account_id'] = self.id + + if 'price' in call: + if call['price']: + if float(call['price']) > 0.0: + create_dict['currency_id'] = self.env['res.currency'].search([('name','=', call['price_unit'])])[0].id + create_dict['price'] = -1.0 * float(call['price']) + + #Format the from address and find the from partner + if "+" in from_address: + #Mobiles should conform to E.164 + from_partner = self.env['res.partner'].search([('mobile','=',from_address)]) + else: + #SIP addresses are messy and incomplete + from_address = from_address.replace(";region=gll","") + from_address = from_address.replace(":5060","") + from_address = from_address.replace("sip:","") + + if "@" not in from_address: + _logger.error(to_address) + #Get the full aor based on the domain of the to address + domain = re.findall(r'@(.*?)', to_address)[0].replace(":5060","") + from_address = from_address + "@" + domain + + from_partner = self.env['res.partner'].search([('sip_address','=', from_address)]) + + if from_partner: + #Use the first found partner + create_dict['from_partner_id'] = from_partner[0].id + create_dict['from_address'] = from_address + + #Format the to address and find the to partner + if "+" in to_address: + #Mobiles should conform to E.164 + to_partner = self.env['res.partner'].search([('mobile','=',to_address)]) + else: + #SIP addresses are messy and incomplete + to_address = to_address.replace(";region=gll","") + to_address = to_address.replace(":5060","") + to_address = to_address.replace("sip:","") + + if "@" not in to_address: + #Get the full aor based on the domain of the from address + domain = re.findall(r'@(.*?);', from_address)[0].replace(":5060","") + to_address = to_address + "@" + domain + + to_partner = self.env['res.partner'].search([('sip_address','=', to_address)]) + + if to_partner: + #Use the first found partner + create_dict['to_partner_id'] = to_partner[0].id + create_dict['to_address'] = to_address + + #Have to map the Twilio call status to the one in the core module + twilio_status = call['status'] + if twilio_status == "queued": + create_dict['status'] = "pending" + elif twilio_status == "ringing": + create_dict['status'] = "pending" + elif twilio_status == "in-progress": + create_dict['status'] = "active" + elif twilio_status == "canceled": + create_dict['status'] = "cancelled" + elif twilio_status == "completed": + create_dict['status'] = "over" + elif twilio_status == "failed": + create_dict['status'] = "failed" + elif twilio_status == "busy": + create_dict['status'] = "busy" + elif twilio_status == "no-answer": + create_dict['status'] = "failed" + + create_dict['start_time'] = call['start_time'] + create_dict['end_time'] = call['end_time'] + + create_dict['twilio_sid'] = call['sid'] + #Duration includes the ring time + create_dict['duration'] = call['duration'] + self.env['voip.call'].create(create_dict) + + self.twilio_last_check_date = datetime.utcnow() + + @api.multi + def generate_invoice_previous_month(self): + self.ensure_one() + + if self.partner_id.id == False: + raise UserError("Please select a contact before creating the invoice") + return False + + response_string = requests.get("https://api.twilio.com/2010-04-01/Accounts/" + self.twilio_account_sid + "/Usage/Records/LastMonth.json", auth=(str(self.twilio_account_sid), str(self.twilio_auth_token))) + json_usage_list = json.loads(response_string.text) + + invoice = self.env['account.invoice'].create({ + 'partner_id': self.partner_id.id, + 'account_id': self.partner_id.property_account_receivable_id.id, + 'fiscal_position_id': self.partner_id.property_account_position_id.id, + }) + + _logger.error( response_string.text ) + start_date_string = json_usage_list['usage_records'][0]['start_date'] + end_date_string = json_usage_list['usage_records'][0]['end_date'] + invoice.comment = "Twilio Bill " + start_date_string + " - " + end_date_string + + while True: + + for usage_record in json_usage_list['usage_records']: + category = usage_record['category'] + + #Exclude the umbrella categories otherwise the pricing will overlap + if float(usage_record['price']) > 0 and category != "calls" and category != "sms" and category != "phonenumbers" and category != "recordings" and category != "transcriptions" and category != "trunking-origination" and category != "totalprice": + + line_values = { + 'name': usage_record['description'], + 'price_unit': float(usage_record['price']) * self.margin, + 'invoice_id': invoice.id, + 'account_id': invoice.journal_id.default_credit_account_id.id + } + + invoice.write({'invoice_line_ids': [(0, 0, line_values)]}) + + invoice.compute_taxes() + + #For debugging + if category == "totalprice": + invoice.comment = invoice.comment + " (Total $" + usage_record['price'] + " USD) (Marign: $" + str(float(usage_record['price']) * self.margin) + " USD)" + _logger.error(usage_record['price']) + + #Get the next page if there is one + next_page_uri = json_usage_list['next_page_uri'] + if next_page_uri: + response_string = requests.get("https://api.twilio.com" + next_page_uri, auth=(str(self.twilio_account_sid), str(self.twilio_auth_token))) + json_usage_list = json.loads(response_string.text) + else: + #End the loop if there are is no more pages + break + + #Also generate a call log report + response_string = requests.get("https://api.twilio.com/2010-04-01/Accounts/" + self.twilio_account_sid + "/Calls.json?StartTime%3E=" + start_date_string + "&EndTime%3C=" + end_date_string, auth=(str(self.twilio_account_sid), str(self.twilio_auth_token))) + json_call_list = json.loads(response_string.text) + + #Loop through all pages until you have reached the end + call_total = 0 + while True: + + for call in json_call_list['calls']: + if call['price']: + if float(call['price']) != 0: + #Format the date depending on the language of the contact + call_start = parser.parse(call['start_time']) + call_cost = -1.0 * float(call['price']) * self.margin + call_total += call_cost + + m, s = divmod( int(call['duration']) , 60) + h, m = divmod(m, 60) + self.env['account.invoice.voip.history'].create({'invoice_id': invoice.id, 'start_time': call_start, 'duration': "%d:%02d:%02d" % (h, m, s), 'cost': call_cost, 'to_address': call['to'] }) + + #Get the next page if there is one + next_page_uri = json_call_list['next_page_uri'] + if next_page_uri: + response_string = requests.get("https://api.twilio.com" + next_page_uri, auth=(str(self.twilio_account_sid), str(self.twilio_auth_token))) + json_call_list = json.loads(response_string.text) + else: + #End the loop if there are is no more pages + break + + return { + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'account.invoice', + 'type': 'ir.actions.act_window', + 'res_id': invoice.id, + 'view_id': self.env['ir.model.data'].get_object('account', 'invoice_form').id + } + +class VoipTwilioInvoice(models.Model): + + _name = "voip.twilio.invoice" + _description = "Twilio Account Invoice" + + twilio_account_id = fields.Many2one('voip.twilio', string="Twilio Account") + start_date = fields.Date(string="Start Date") + end_date = fields.Date(string="End Date") + margin = fields.Float(string="Margin") + + @api.multi + def generate_invoice(self): + self.ensure_one() + + response_string = requests.get("https://api.twilio.com/2010-04-01/Accounts/" + self.twilio_account_id.twilio_account_sid + "/Calls.json?StartTime%3E=" + self.start_date + "&EndTime%3C=" + self.end_date, auth=(str(self.twilio_account_id.twilio_account_sid), str(self.twilio_account_id.twilio_auth_token))) + json_call_list = json.loads(response_string.text) + + invoice = self.env['account.invoice'].create({ + 'partner_id': self.twilio_account_id.partner_id.id, + 'account_id': self.twilio_account_id.partner_id.property_account_receivable_id.id, + 'fiscal_position_id': self.twilio_account_id.partner_id.property_account_position_id.id, + }) + + #Loop through all pages until you have reached the end + call_total = 0 + while True: + + for call in json_call_list['calls']: + if call['price']: + if float(call['price']) != 0: + #Format the date depending on the language of the contact + call_start = parser.parse(call['start_time']) + call_cost = -1.0 * float(call['price']) * self.margin + call_total += call_cost + + m, s = divmod( int(call['duration']) , 60) + h, m = divmod(m, 60) + self.env['account.invoice.voip.history'].create({'invoice_id': invoice.id, 'start_time': call_start, 'duration': "%d:%02d:%02d" % (h, m, s), 'cost': call_cost, 'to_address': call['to'] }) + + #Get the next page if there is one + next_page_uri = json_call_list['next_page_uri'] + if next_page_uri: + response_string = requests.get("https://api.twilio.com" + next_page_uri, auth=(str(self.twilio_account_id.twilio_account_sid), str(self.twilio_account_id.twilio_auth_token))) + json_call_list = json.loads(response_string.text) + else: + #End the loop if there are is no more pages + break + + line_values = { + 'name': "VOIP Calls " + self.start_date + " - " + self.end_date, + 'price_unit': call_total, + 'invoice_id': invoice.id, + 'account_id': invoice.journal_id.default_credit_account_id.id + } + + invoice.write({'invoice_line_ids': [(0, 0, line_values)]}) + + invoice.compute_taxes() + + return { + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'account.invoice', + 'type': 'ir.actions.act_window', + 'res_id': invoice.id, + 'view_id': self.env['ir.model.data'].get_object('account', 'invoice_form').id + } + +class AccountInvoiceVoip(models.Model): + + _inherit = "account.invoice" + + voip_history_ids = fields.One2many('account.invoice.voip.history', 'invoice_id', string="VOIP Call History") + +class AccountInvoiceVoipHistory(models.Model): + + _name = "account.invoice.voip.history" + _description = "Twilio Account Invoice History" + + invoice_id = fields.Many2one('account.invoice', string="Invoice") + start_time = fields.Datetime(string="Start Time") + duration = fields.Char(string="Duration") + to_address = fields.Char(string="To Address") + cost = fields.Float(string="Cost") \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/security/ir.model.access.csv b/voip_sip_webrtc_twilio_bill/security/ir.model.access.csv new file mode 100644 index 000000000..fd0516d8a --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/security/ir.model.access.csv @@ -0,0 +1,3 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_voip_call","access voip.call","model_voip_call","sales_team.group_sale_salesman_all_leads",1,0,0,0 +"access_voip_call_client","access voip.call.client","model_voip_call_client","sales_team.group_sale_salesman_all_leads",1,0,0,0 \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/static/description/1.jpg b/voip_sip_webrtc_twilio_bill/static/description/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..485194bb605f04115d742088e2a7a5c4416e34d6 GIT binary patch literal 56129 zcmeFZ1z23omM*+;4FrOFkU(&E4GtklaCd0jT>=D1a0!s0!68`C#uD7!rE!T03ZYKFaiK9G=>4akP8I?@X$C6G_IMN_VYhL0sxPPcSryvXc{{7S{NDt zk{#$5^3T|>&o2aiA@B=e_6A^grV&-OMN1@>avaoak0E8I0-|Pt-sNIkk z1OJzJeO&BsaX2ns0EmnGYy7Xa1#e3e7Xp7pfSr|% zho6m|pPie6jg_CBgP)BL_(y2~@EULd%m6oNumdOn4ZsNi0TzHIH1+4M2O5Q?i;Dw4 z3yYmIvyrL2u^F?8y)BD}kpl}GGb;-qDB|H@WMXaRLSbxX0kRXKJ!oj6r2v@<(Q0rh zuqrr+n^}TnyqwHld%aRM@v=7IGo=*~euOIM!S7+~U~A@LMB!m;W9Q88Aw>C`bbe_3 zXEF<=u%MHvIlqd8)bAyrS3;D(_r=}ao!Om(+1|;5g^iDokA;<;g`J%VT7t>h)6T`n zgUQaB>URMWX3i!~AO{zay&c6*fkwvmt}a59uC5?cesd#pE@M+uE+%6m4pSyJHd7-e zBU27GCQ}X$QywlhUUqXfW6Ix~H#PZ7>kh6?HovuPYQkb>V`gh+=i&@SgN=of4~ zI{Kg6^M490VL?+9ev_Ylw|Dwe^RLYu|6_OC1|%SRX zf3#l?J#jzxe=L`Z;3fKN?Rw17b6gsa}+~;Hr!qQgawP1)`wh;S&%N z(LAH2drr^E#m&RZ$1g4+DJ3lgMj@=@s-gI3)Dl z`>?q94+)7$A3r5$W#{DP@~t^wE9)wi~_cXW1j_wpG*k8vr z3!uZnKyMx#79av#Kj~H64-?F}-^w2mML&+e$%=k1Qvdu^3GQcF_RmaT9AF5VM)xx_ zLlWTlPph!}o}2uG>uI52!2?h)LNDXDd_DdF7@`;1kM52B?fbXpqHnT~vwMGj|JKFq z`>or8D19}{#Jc0bbFys4I?3I@ zsy19N^1xs5L@F0|i1wX5MzoQSjq<{^BZ-3~vkby3VPjy2Pl!z;zjpld*r@EQ4EV-R zIdSU8tEA=4^Op&^gC!1$L^*o7wtIE?lFnZ*({hH-h}-cl*r#RJ6KmpKoE`G%{UReQ z0{O?2`18sw+^yoZw7Xe!J8(d3h&-q|8^)|sIGb=$GudglXL5xzGd@$2{(Y~#!aBoW ze-GI?pS)*qrp9aC;CY)?jImr5G$^M3?PT^#PpQ=iXfio|8giGuoMk{E=d-x*7-w@o zO4IRrWU#5MRvt~cfx%^``g@nOq-l$PK}WHeMM0Yl-Uh8lKSq0}hMnpf`rUpuDZiSK zhJM}XGZuI5kLB+HyamsbG?dQeROcwS)uZe*c!z2l8iJjL1@psnDu>AxNe+4>)1jxb z6eM1zKK8XCCpKp&*gCNWR6jz+Az1gg=vBQ@-LP3($qb}Wvd16%sgIDcUk8PditS)# zeo;}FA&|#Z!I_Y%dH{sNPn9K=12{z-?yTgZ$ZP$oX#gB$-GQO^XAEiT`(15BlvV~t zF_O-X&K^uzTHGPiISiGLk%s{Ev(FgGVSOWKk5tY_O}=amf3ib>B}!DS$FgTSPE#(MP?{NO7DwT!X8a=l zjNYF<%e8rdnTP~$LrPw;T34Y7_OXr?Gh2@h+g@w(N(q~a@RwcXY}YrU0g z3Tqu}odVxvMKQU}uc7Al-o`n=MwIV0Zu!3tM8h+@Op91dGOE5cDJ2Zrx?}F!)-6{no z%VsW3USz0`Cz{s;*&V@~K@tH&OlQqagChqq2SI{JJI~|JFBz6-_sgQ6&QC;$rj8J6 zILROBSsmDo-lel{kV0g8;0QM-bAKr3k_2kTNp@pohAamSfvsFkJyO~qdziFUT3uM` zBa=O)cog~Nm>zG-%Wh~{OXM)#Bk}0bLiF+zu29X{{ac+O_6NYzn9ec1Wk#_82eGDZ za##k4Zzi?oXq&yuf6tlly&Ss}u1ckaeJ>6LXE}DN5>9b)pJmUbkb1Nj@7^z6{?${0 zefP&+UMlhH8blL`Hf6Te3A!!+ZNxGD~0a^ER^MCmPFGedti)yW!saqX~8W*;L2 zaP*!a>tw$|M_tUk-Ia>s$6}8zm4dygOD|`QM)8tJG{q1zFb~I^Zih8IOihv}35zZX zz}_`Yq}TWWEWhC*$I=2N?yQKa`w zIa>b_@!c`XIl?V>oGa6)6vXfNrfxi472B>WsT}RJi?5S`w%y=Z$V2+RVcvf$BzO1` z^j!j#zCbbNVjY}1Z}mbPMkf5HbRMgT;)Xp-Esr3%(SC%%>`h~Z>Eqk#M`I+LTzE|@ zbf=1yIvv(r_t{<@OpKqKK{ABYaiVH)MP%uluoUz!YtI4~#L3Cymf$Yc!qG*!lyY+kdp;e1D`Y5K1yEv>b8gkO5 zcvZ#bGVbeE$|3qkrjNsmGLWSv@3e_+6-?{Y9sq}|OyO4Xy<}jgpt!`MojaK9Lf|Up>wL%#Bk6A9RE$UsF5wy6qxzg#jd3cUl#zWwM0z^y9LGDORAT z;G3MVYU`B}b%;U5n4n^&bp9jJ3hgzndpR21 z{rZG4{A?=hnBqYLkDi^8Snzg0tjn5o2%__L@x81-JWZxI%y@iuaZ>DZLEt1Xstf_G zW2eIFrngq#DeGO*C+B89gFWoD0zQ(b&{{u-3?l9|pEMtg&g-G6N?GP5`Gk{EMwAos z_H>B~B)d!w>*8{>kmP#di#lG7^Um#r&@1^&*4((eHC*jo5!9rcSDG0yvWdZJ>ASqY zklG6C``8Uf6+7+1C0vrPr}#x%A0lS$#xye3T_2NGgw4A10!#tR?;_;u1~fM>DJv$4 zlNWOdTb6K*_1x3)&ywEG`h88ph7g{is7ub&(i>qpI1e439ZbRHf_CuO=NCcoQr&o? z%efBiYeB?iWLHKSTX|VAx$g>T{S7*3uBg~o6_RaV?JsM=Dwr~jV>=NuI(clLpoXo= zrW;^RPZxF4fW6I~WM_TA>NbvB`MBkhsL%cN-Lcyhbb1#9q*i)mtBV+_&9ER{^j~S? zbnMt30H5SGB8)GbT2@t?fP`uhU-wgD5r0VTi&@hCWWCuQMg?zgXVUg!b}Y9K ztx>o1FzK74;DY?#x8)q_)uknuHYR%8U}dZ0#c45X*YkH1G$HG~hNTX@Ejr~b1V0#F zbkIhPqg4e^Q^zGP?HSmlH|b*LYGnoEyh{VUqGvfcMWxFsXixslI+4bl6VZ-)gSuw# z!&VBK{kC7YG_SpY_}!m>RdL*qU8je6xMAW$=nGN8PO;O{`noz7f1DOy!DNf~OV%LW zddLpH<;S-8REEx@RE(Ai-)&cNv3t@Z(v8eQeaq{O)OxoP)AtNHDp%zS#MpQ;5MY&F z3K?Eah{Ha#(Z6te&`oO>D@|@LqrRdP+x6B@`c}Kjg#}X~Z*hLdEAO)_>8m3ZzGqm- z*)n4S%1>x5`=0br$4{0E(`;vJRF9nAXsvOxg8yk3t8L2vIHCT;io>N>?0q+1^k#rsZT|2tT@UC4e$uJNuPdAyDu!H`>dPu`-W z*N?A9Y?6kmj~3|!D#uqBYP!2A<1dL${NsoxWv^HU9)M3>w;~TfoP4hT)cgBtmVgIf zEp99093}h#kPI6;ybrnyUS`mHvM206v&4F}pg%wF35k#TUUi2lao=&6kof*QTHr@w zxb3D5qzMh|HkazlA#wIvzNE?E{{EJ%odoOjOR|2@vxKD-TUfLWY{+!DYNP6`7)lkd?xFXpNF++O722|Z zFQYYB)*oFa^tHrms`^z%wF|gZCk(H%12yGBxtH&rWkv7^^B)e>#paYBDZE9Mhs~Qj zEjaBoaYCxtNLv+p1<}3~_b!|+x3+HJOr~r@vc{#Nnk??i^r$}`DLxQXGyf{nK%G1# z$2P~FUTeZYpXxsAxUJ#Jf~GTn`LvPCgm!u_xL&9I#{Gv{CvW$VqIOc{eN$=BPO;go zDs-5(z7K$&ZPRHM{}1bk%df?Y=+(H=be-}JBK0YVvgORKFp+Am2D*B~7c(AsK z?bv?2%!Rp_iMH|;_RoSBTROxHZ!|xD0FHjR(!J?Yv~n>OxGdAE=&;v>`MKk*8$F<(th@el`|yHq(u3-LXJo|71(57j1HEKRdx3 z+#sdMjL2cQatlt?Q;rimJxyj?>YWMpra+m_!#fH&OwHOnOOjUi@lc_Z;M z*I`tOP#J{iY(2>#VGN`>@j{yXb!%2Y`fd6t1FcyF$N%nXqNrf2$$rWuQhEqlsZw9#_}rp@k?>XBD&dg0RCd-~liny7xk%sr zfTuyS6j)-rzRrZ1CarV^?GL!Y8=Lo-@y z4o(fg9^tYR!XuS8JcD7*_IrII}5Q5|DbEY3FM-a@bFh%QW)oC|&RzH|Sw6lQ z{S8#^iUK`XA|&=*t9rp^mqDV{M|jCh%;}o?e0bL0?}%+;2CecV}0-vrCJ^=i*gOAdespoi~p z^Dc1j0XWs3ILexZT-t2adoh)Kt>GR)AjB%v%ig^MxjbUI!E8%*OW5>$0F0`m76%|; zzYeri(^cN>_!na->zBG@HCOlCY*m<7boxvW09fP>$BKo-zgwr3{G3Gb?g^8vre%}S z5k|=u-|YVT(PMwtN-~4QV6V;8O(DeR$s56U)$Tb8=NYs&+*fwzSKf{NRLl$6!aFP|YBDvE>dQ<8S zd;~CJsWQOwY-5{7;|MngdmlTc8&K;=oUD?o&%m?!)iqyDLwHLd=9*dGSG+PB0a9Ke zXN~NU5|b&ji6sA7>hL~>j1Mk-Fn24kfxbAe?W!EPcIRjH=cb1!-zJotV^NT@lWLk; z6tomynKj%umE2oo?T*@wjPBgnKAX5#SC`VU;wj4QjML>%KrF${?gtQ6PgI?d25r3 zPcyxaD%rL(jQV@r{^0datJa$*p2W!Ua6rsX8}BL=&Xr#E)IA|mP1ZqQ_T=D#_5N-R zgmAWGVop0DJu&2ZMWnK-QmC{e@#W)e+I7H577~=|Ry2za?oVP{=x~b7$=KR+1^1g$ zIJm{9l0=+!a;VI0ZSzCe^>o{uZE{WOr4V0|n36V!AOXh$YT*prRZ=I+`^;<3iE(a( z*T82waxn?xu?CJp^_1-1xTZYt_q&=0fC0}kD{OcfYNfsTV|W(2PhKLc+;)LEne!*b zt7H=7%hj^xA*#Y_+P(ln(`EIgfYb!N_8+?Ex~OAW(X4-z@$>rmPQ6-Ub-qwkK4yk3 z6$7Vt*jf=HNg$@uBi*bpfbRd%P$Y??1oKY>_~E;@vqE~_Ke>vOC2;`dm&ulUOL3q% zYR5u%H(per=UE*SPsewPNy%^bpO%GYnfjhbt@w%=*Lu8PQAW|V?HUMNE{6yzH+*%e zn^x8Wr&Et`?!6)vP?}_9vM*&@gD5z?r~b5LtKwuiek+}2`DIgcl93VK+x;$YoeI(* z;9MJF0qQEn%q24fDeKyY2|C;6?h;{q%HJhoYOJqH=?9O6C}WI@sbSPH`>ENi3V&m; z6LJ#p;F3?X+Eu8ks;FhV+Vw!qvVDCs+6?alp6^*DIgviQ^IftY(NbTaKRjD6(w()g zw>hLl0+}>MCa9);j>81fId(hr67L7mg5al=q}kgo*c#ukMv&ll>3zP~mTK0_svK;} zF6Md7U1UsIDe0ZWgHnTFl)&tK9LNWMhRgh^2sAq%(>PMLXTPVJ@I<@6B9p3ME+=9b zq5d~z{!*W?s;ODEO^^_j1uY# z6w5r?419aT)@cblft%)7ss&k?6`gu)Tc^^}-wX(l`=ry4C)IqNqsE?VjTf1Z%z;VS z;!g(B!`_#EmW8($v|6tTW`?09>=bfTh&rFN4hnOTH?5i&^EE4|Uf7)UozL*Ud4(Mxu`uqqmGvFm7``3 z#N<;-%Zacc8{cAPJ{&a=w}q!q3D0fu@pTFVE(XX%b+R(U&L=(73G9sGRByK8VEfKU zzoczc!t-#SpHJZ(zq&xfiM2=gK(hJ9i4IOKtaLUw`Q_Jdb7%~tUqX}!Qda?s$wcp6 zc@2sB`Vc(-`U)8w@R*P#tQY;W6x&hBk6*hrH(v4(Y}Kwg_Y9G|rfRB8bVS#15X^N) zo)p!Lu;4xI0HAtN%+(;U?4<4ifZdRuz#T`gp5xlh?#~{f&FV_>2L+Ds8e%SsKKbog z`uRNl*AFo2Vf4fewKk0F_4U3nt-13x@o$7epS^jORcSbNdbLj#p(gF2ZJ1RzWy?@DETaxD=g&1=sk_Gbgwub9N7c#{4*M-8mKHQ@OpNnjgZ;>2ZaN7 zMCwHH?^A6N*Qxv$X+v?(iWg&W(MeVbNJm$}fL2x*9q=~+*7E0sltA*Ea{-{s>tl3y zaXh$7;#g?m&Z`C&Co64;)R>K{5E#rNl0G3SsSEX-hgvp_M3;QV#KtSvR5NWmZ402GmelJnXWE!{T1**KS zPp(qe_+v4hiV4m;dH-|Qv+Bj9$a{(28|N`zK^Kt(g)tQ6B3w_&+%4_mJvXGD1MJ-E=+@_Y$J#pGZz;O%KHjwVLC4FO=~@mZuxA7Pw7PO$03pggcYVA?!U| z{q>0*)gGxscIEWXyZTz074tasNZBn-YJ*qOa915e)Cu8L2m^A%-<8=wG~R#yAYu51 zQLf+>yBK}HZ0k`>b{S5L=+jY~N39ExISJ|+>c{xc6W4HOy^hA+N<27=B+@PijL(|l$PfNh#horXl~Q`B9E8WU8-l3O89J4Sz0GNH_9lPkI~hdw|G5yV`W8+*w8j7{*C;qWtYAp zL6O{};Pu1r)ycbi$N^-$FVl_R0-4RLsp$@UB_9o=fE60Zw>~iSdh}}*H=zl~R($-YhQ*4KlA9hr9+MZ?D+}p4fS|H?7 zL@vD%D$mHZl3(8ASCf3sPv2Q?6SbqNF3JjrU`QOTJ5kHXR8mT0`BZa0OD1Xov3+nD zNi4FnaCT*KaVoaA#nHP+_|2Z{+8kbe;55QeSD%*bQwpci9Or=OmUaITN7 zSKP2yJs}+pHU6=8x6&S`2p8wvoWmhh#?0xf_+x4|UKb(@V(Lm0v?PNg)Q$g2NAK=s z5ml`|q&!YF#c1s5ic(_N{-*lJ<4$&b2Ra-iQhwG0oyS|+E^LF}#pTc6-PUQZXngu4 z(oomKyP4-GYyTNE31-ukCMo0OJ6=m(k=24B_{p9K8p|aG+N;OU9G6qjcEcy)HkB=n zB9K+3F-{`aT$v&+;CKm&9JGh5SLGdrZZ8^&X(;;31DhJ7^EwPBtD7opUd7cLfz>Nj zk;~a=0hi5E=~CyHl_QLdcJ~wTuk5%9`bYbZ`BcPO%&B9WyYlVwGISmQ9XQDKzCl*l z^S?F!VE&FP!L6B{jvwYRDYK?h8dax`6o@P&3AJgMe%drJpr%VC@=Ns+oMc638MQ*p z5CuYm!*CD(`#0M5_b^@eIRB=gQ)$PYG5DnE+o%6+!IrbI#lib?v%i<2`~V<>f4lzSVHCK>z%Zf2mnaDSgEeM`CU^M!{8ec`=vd;o&2Mx^O~kZYFQ9vql! z{4taKZ~Km0BuP^A)%PEC7T0`CdW@0hF7#DZ&0^&JOVpI|FHRUzQ2S70X{tD;%`6u*a$_F4_7V4!66MWaS8Rx%9`IG6`9e(dgdv{Ft z*W90cMoN~ewTz4I?B8>Lqh|hIDf;)k-*}O~ME=6^mlFLCetMv@04{WU@}Jrx{CgKO zU71Lf5Qe;-f`0cvF>yom^S!<4eqzsAi7;VZ$3X{%ykJag-_x4j2jB}^k#Z}u|n@USWHjrgmXgKFm%w z7Zq3xu}X@u3Te}dLa+$P53_cHXsN#G6~?7;2L zk5q+p6$o{voXZmWj|6w$yvXE5mvT&Z(jdV&D{$3&;p?}lP+s+}q&zYwUE}Es)t8n zzW1$N#a^Yj+d&xw+^gU`f1)Un$71MNw3 z%*JwSVtLph-TjBDzGKtrUHjwmk5o|VT!>0gIFruqbRk(`45`!quWk?j99NO5Yr_oZ zJjU@cf_fbCr*U3tY#~RDB8K)6S&`r~f~Cmy*pg{_%0zSCEnsb!t1fSp(UFkGOhRq0 zzYD>T0eec0JnNi@uxJ$_+P!5lnYkteq*ayRG_w7iuBMI+mHY^up#dt*;!W3ye|ow#hDN*)xuU`<}x`8K$< zfSwraBu#1=Ese57%HFR@x_=(&h!P&>)6T4GGR8M#C9(uFI%}oQvqw3-pfmSzkVKsR zd)q-!hw8+^zHOeveUKY?mpM!Eg4j? zu+lQ2Ca7?+RR=$|6@_}66^e?u)HMA(VTC=#U?TzHHDhd$zHxudo>m) zB%pMSBxSSBpJl~wn|k~s#JZrdBh*h8j*ww4N?Ld&&E2C}im{Zjjj30X_0u(6L_ycl zQUu(t?p@XbXw>pTJM!CV7m2%aOnKF@MCp!+I$HdN2H|FGPo`mg#^8q;UC9k=hyH@2 z+XYR{dpnLU@=!1DrrmnHzUvOd6S!{uT0*s(y5;#~-FA=4Shxt3Y@jW*xfTUw6RBC@^Dcl&7qOJNPR zd`(9-_)1#y(sqd|(who)Bd{IAdu@QXJDgDE0Nv^R_o1tMDqsK7yt}_4$~_VP={G7^ zz6sq`QG!wB^hR;H(OUf!8Zz1hD6Ej7_he3q)0m9&Jn0f{~Lc$-OTy>I`MY8r^s=u$$D2Vj0 z*}L3C()bA2TA9?<;~&cmFyLsBW+kMq!HV|qE}fU?_;Megs9NutijhqdEiia{5{YKM zW9$ekm2D>FC95lOizH3>q!va}NVT7y`npKg*o>y8es>3Q_i|NC@*pqSi)213{tM_l zX8TAR+W3`xFXF63UI4}RtVC*W2Hjm>y&0u@Hiu*~823rp^MyP2 zo3T5zV7k^Gm+4+`<+ti1-1$~&Y^?nT}Du6N0hzC-ofw_6!NTH1%?5 zZt!f2g3p0F$=BgB-)g5yT+vdPggchZ*%hoA1e1V5V#V$zW*NcwVPEUatYCe)J*Ly$ zd;heSQ3dM7^?QSaz%aT}XT!hQ1OBhLW$+*A6Ku)f=;!~6)cNAyyyUJIqGiU(kb<^lK)U5Ac){_O<}*RN{7 zAOT8#Y00k#=PxtFKR+oHGH|Bo!LDH=+dzG1UO?jSTq4veWzBm=n8v4H;D#Z*A_;Ih zDL5LW1-b*EgBB;01=gjisSRU1S;E`$_5Xi z1``}?y{xZKk4QUaw|6b_QJ#GVdp3hwi@mj^`yEq#=0#~CwULdo1x%59L+39L#%3mW zd3;E-Y5T66=A2IuK3j-ZbdEO4Q+|33yG5KZ^fGFuL%8lE^MT@fSDrD(?79;Qu#gW!)k}fiBBRI+=Lh87{Bt7*>vRYH6b+!%I zf%uJsG4`X?!(G+SIzcN8V>soEqLSaV+56|nLLIu+tc6red^SK>Hd0wy<>Z5{ufn zE7CKBo@58veF^RVV5YIIuSgZ$t`=TSmN#p7qxyP7qy2o*g;k0o>J>8YzNL=A^%l=J zsMFB!os3yBCl)Y@=fDj&oFOM~4bkZ^uc`}iXncYbP=2K$S7V@~5AUO{nnYo=~_DeokkX3ky6Bz>N@SHJSui!$GD+xtF4+aYbVlv=!*UBroO+}UD^UxJ zid63-AVNf)$Xjz&L2qYRR97D71#_VJGS3zr1pXq}y-x{_6}LlhFCe1fXLA*_ljL@K5(CKqYje%F751~F?*ka60kyDpK-E5Z_vAV$Ku_pD)pcsW{aTg%0Vs>!S{#M41H#sPG^ zoUD`T71FCg==9ppn@>t$?HCXD5uBXk*hANEx&ovNyhvT2K2=Sm0N7>sbk`q%_qmnU z-MEzApYZU;U{v52?7JK4HZkL-J8^>448vcOaZb%zH%L|ApcB5g)iTJby}E7X6{tKu zi5(-Pe>GzNl}TG~u;MvYGIb)p7L_Y{ROr)yEwTOQM3!+9k!zBk9Od%R{dZcpCfsfh z^Bb+IioOd6Y6Cp_Ea)YrY;haLm{%vvHe@ydkZy5rQtIaE>|v-H-ro^u8*rmL6ubG`1a ztHfU3V;K^Qc~+AdmR;xZGLUosqJ;o2i&PV#BJD7qM-gJ#1`xd-?z93i%rtaInP=7P z-x|Sr7+iZRF$EW8nc=tSBFU_ z0|Ukih@NluT99#UdAubdweOF$_nl=Fe5Gs>4qv-+zt+w!rKGFd!dk z%2iP6FWI1?PXr!2NLK?2S{nDnW3B>ij$TO^nzkO3$EIP*TSpA=j`xRL*&95!NB#r; zok{)nS1VA`JCp?hn9N&77I;*2DK`X8>ukr?RU3BXfJhLiBY@9>hjv97?~kl`@hN}Gw~n7zn!|Z+%{y8&ef7gq>EX0ISM!W z*5t;GbGEro?VJoHDwNz0thIrEH<&4#P3-QGBfo8yyj>eX8`Xjuvq1*~rWDjD$M5 z3{DJ=vi}MMARK1#4<&59igIfiDiQKOA0p0%~Px*Qneq3EByT+nvrpEUfgXlivFSBgB(7i1Led)i)7tii8IN3^s z+2&i4$N+r$tLdTTpC6$za5Fhg+G<}YM#z{|M4BelMCMcRA_+e{etjTQ>baV#fck)AD5LA_A&Erb0Qd!eOC%2_zRH#cFIs{kAsaWEUllhDh+vk6MgL;38i!w-BpX!J^=ZbBj@Ay ztM?hJqIh&)9spa#eUa^ZPT$`%hY`Z)n|`lE{(Bybaah^!b^b&0WN~)cY%@dVTtB1y z+2{E42nQ0I8T5yQ(&~3w(GPT`T6P=r9_f>>THY%^;9uS$*YL9$S!N!uB`p$)8akuJx(F!Hq9gviw3akM~s8SIF8Hp zshvK(c=0E_ae|hk6i;;vXvB7dAiM?l9oFZnP!E`}gtwdIdSp>hY{0N#Ko|_kd`b4S zRXJ1Ft&i?@d=DS#+6ivTF|+g-Zu#=i6>e42^$GN-uPCnXQi!ZX88&BFE?fe9F!X3^ zX7lZr+|tmT={b}iRSgWFHx#mu>Z#Cg0$%Lhxjq1_P!4u!#u}7m^$(5SKTyd3or&|$ zVE^O)1v`_Gp7z*u!M)uCZ6b3iLB|=J!^iwe2s;eegvN;q6fFQ)GFkQbL*V0J2hlEq zZZ5>2{5osz>cEA0wVZisiL3av*briA((ClVsLbK5f-l(o`R|^hJLu1}Zq}jag!MEi zJKK|WKW)$$U$k+`h-{k5I?l(LhxJV(rhE2PnS zdSB>zyy*|?@fhqSFXe!3dENcY6;E3q1-w`sJbD9*0dF7M1-*Hn57P_g0ug1Lu3t$p zka7vg62e8^wWB#=)eQX5C-T0-JZ|?5q~CuNIt02N%semhCRLP=nq&x< zN}OM9I3Y*Ir{BSW7vb%kG-}z%94*B=&^)|r2T@YbGFH&bGRXC!i8|=jne2OVsY6+b z2FFhYiqeFC%KK2ILhzC7gQ1toh$u?HwiHq>6Ath{Dgh=#1RvX1`WUCz2YMp=gm&Ej z=}YM1ulqHr4b{ z)4_B5Bf>&Cl+p@IrlS~CF#cVxWU(-slRMo5y{2t-ClrDu#s$iqF3q5>c4+c-1PXCxZ z(KCcl@h$QJu0ISWu%0`PO}oXW0VkYzBG|U0HvfPDXtWd zuPlnCs|}g&TAy#h*-qU{fJ47~L>Krtw%|Q%yE6eQYpO}KTwE9s0cq87e9zJ3=NA1f z!eTe-j0U=Yq||r+T_oFIE;%!W(sGdC4Tb~C>1UK8V)es=^Y&t9SNXNd7#OAqV-|WP zA$ciX|7K0~vefU<4}c%!_PNjcssGLS;<6|K`E-f*>TV@~N3L>2QJ7{XPw$&&p5EJDwj zq6+>lS6UupPavyk+o8wZ+F{_?jio*g5P|DkH$>_uc0I1HOKsQ2nm0iAGKTrR2(x8F#1JGo9j|2Ql z{0*aDfc)Q71{gX2%d7Yuk(fNyctp^A0!g5hu=w`N=?CCs0IIz4qJ-{VY6JbqvAgc) zgT-q-*v;~Ye6!+G8h``uAQE+Ia=!a=?dRcAiZO{u`t1s>)`+%8F*3K#r?|s5{#P3h zz(r5C36vcGor=FJFzAA2pvP?*g(pWP9lZ+|4Rj^3WE5K7A@cwj!|y()^M5rt=otve zUR47(;a|MaTz=fkMg~bBq^O-~fsa47-QDg0{rERh)z0dkYiYJ*wDP;0*XJPYKelpu zZ)zI<=m{+H@u09l3e)0-xzMh}cH#p7s{G_mJH2YTBH1}#3~U}MYq*Krp7`IajX>X7 zn^0c*;d3f5=%9@Xtm1*NV zw>?i3KX;H4)}@$p?A)C5I_Vi4?1FCk+5i0YBkn)R9wz>Hp$(J1B2d63zbjDv-Y9Ve z6Z&hAbyQvzxP!8MsK`B?NVue3AtulR2!`X;Xkrduz_Re~!&8~(%FU>`0pgg#CFkan z0qArmxOjiX`Da`|qhf*Zh7~zuLd3Wl-5~fd%1_+p&>b&^*60O%F=l5M~?6=*f8(=?QC9-H3p7DSCC@OPIg%B#wrQ zILkRFnrj&@En6S4a}~LiwdI0nfLYLEbQq0DU=``xv3__GtR;6CJhs06;vtO2^y-nY zp217+hEK`ka%f+q9B^WzbT104_Astj+h;?{5CdJ1nK`d0l4o+?Rj;iDma22pb4NtB zukD|HIrJcd{xaR=i_cT1ADK&BzCB-VjB<)&bhdd%*ZFE+t&WgHjmf|4$iMj(;m*(C z@KtC_{rrA8s6et%sPP1JF=TOGq{cwntd#Gd@(ObxkX=fw*p_Uy<9cU@r-pwo0?oc) zPDc{tm~XGHIah$bvvjf}qP=JHW6$MAX3vIcr3M^fL>UZA8Ewdm+iq#U5(z6L*SpwS zF;{h+Hqg$)ZXiZNLmg8QAHvKl#J!PZkhGeA`}jsgq|M+GF(EXX$v`Y*R|TBNBvzVJ z?u}-~Av1*)N2-L89XZ1bxOQmSlWdj$B-`~3*(AQE#&;Nkqpta}hA@|(>eIYtiZ#X+ zjQRFV0alMzBamj|U~iu}zbOz;^R}~&qEfOk;5Y_Amy+@v5c}fctUFoa`c1ZK%-XqN zPP3SsiPLP7js{(CnzZ2^qXWtk#_ek;G4|Tu;IQS+-(YIP&cC&7)Ngvy)}n|BLi@?y zZq_AB{=;@1K4J4gs>wIqpiVq|FC4Gjw3OZlu0I4B6(3jZfT3 z9*a+yT+KqcmABa;oDHGaoCPh8si!K=5gHtK!7Bnx0zLBbT~$fi4RsAQV+YuT8^JRX zW~K|ZgcLD^I%l{H_PgJjn56A@*ZqgYoh~{i-M^F6*Ml3rkLFZ0ge)ux6`W+cxwPUq zND=U^Sp>yc`HFXWsRf^%#RMre)QxrDyi`xLXGzS3v!ixE#4LS<0n_2sbokDi{4jd= z{17BHU*;+=pW;Du_;Nv;z#Y%czLA?-j5fAK@W~kHTIiOjDLg;%QTY!0(`wrtpJobG zq06fPl9iA}2LH*vdt~aA@p9)?1#Xs#aJn*Ap86V{DtThJ*tbk0LoeZ`U3qzN8|?Y# zW;^&9-&K5esCX&`L@X7qk(=l{d?#rDA8rI$yDyi#(tFV-AB719X@77~fD1U0Qv8_t z;W6eBh9cRwq0p@H&xh-8y?zuiXMLrsbEVk#aUO#$$w>kGpU@bH%Z1Su68wH{{6B90 z{j2ukf5r09Uq0?U!YdPwy-PYbjr=}S&}L2h5v5hwNeX#047!FGP2f{Ye(P>NfTR4f z{~xdA|H|Y4Kie#2ps)u|$}imI+r+J)sF5wu0Ds5DBk5y*`2D~t5p%ljzc7B&r8e9 z#%ylif69;AQ2gX^GAVRR;_nUn21+`?+&l0r(HgMk@Qu{z`~TYe>bNMkeeXe1LX?sQ z1tbUQZlt?oNXel)MM_W*h8_he=~iH1NCD{@8f0jOkd_t+-|>9*-uIq+&$;it=e_aX z&u4%5=V7hqS`znu3j z%jObga0(kj{2a}7S3y2R8@;Z)@%<<)s|cCRxbp*@cR74VOzr~l1jZ7tp%O<8HV2Wa zDAkQR@<@EiqIbm>-QFJKs@5hXCP;-h&oNeFIyNP23f&Dz$f6=jxnwX)B}<)!O(z)i z;9*K@wID<-Ua|SuV3^`G14MQc3o|lKmny&2C*i&x&JY&*k6*wi48E7V!V zHG(VYHik^MSH9#$yTlPkU3`3Wv8SC~X$Se#3vG)!m|m{q=fZYpjZ)G)Kp!6ov1~g=cRs)|t*Iz6;rScm1wtE7=m< z^{OHhrkB{x-{;3ovw@lKp*7@air(|*p4_xb5ABz*Vm@kANd0O!a|Sgu4Jqhn`FLEh z*X5Zc@J^U7=mTp?U$6RVWdLNr_ghqVOGesIh3d=naUh~Fj6+7Fp<@@D*g3q7HiiQ? zW@_@pP88>5(nGnUraVYRFThB&qGrou>#PD!(q1DuG|p0OwP-n1_N<_tWq>~Nfre~} z@-tc7Xm03guwzw~uz(y(&+`#ZFJ`#_Cdk4y5zXFpsOihob2@uP{%o-gG`>XB&3@c> zQ27HjaEjdhILp zwF+O{m>#^Rrykv_kfH;J2MZFc*J3}tFt`Y`p-$wx!xPv??bl>>pIWon8YiWA2?VmN zK_bmptaR#BFxOlF-QR82S$bP>cU|VudbyQ!;aUBn3)n z5ANQ7%9!ZIQF;BWzsM%?5E z%#?6*jllizP*3+|u#YkBU?$)^Z9YEStT4x|ifw65GTa z^8sN6AD$?d?o8(3`?;-|$Ih$f90$e_PJ#e|S!-BuSllavvpw8?uP@?=MZAlKRdEJF z^Ce4*53##MSLL~;il&Z3Nv)qRnyYitGClj&9OCTD42_(NuNaQ56lj_)f6QHts1`Na z#m91=0TLT~v3Iv_X$$g6SD$oC16Lv0=SNJp?NfG_U!;#nKeNJ-pnqGoNHcEt zvdi#Iy`iw-j%TqM@JCh38JnS*qJf9Dcus4yz311U@th{)-cJA)Q)T*=5UH6N`0Uuy z^cu3EJXHuk#>&>aH?U7jOV7vA9oY6#LilVj3!lheH5p{w!i%Nb=}QnOXVtmxE6r{_ zf@NzU>XR%X{l31?Msj$#EyokRl%qtr(q(KFQiQk=v83!KVOh({6)kz|1a8T|88Yy z^3Yn>Pg7?RHT=Q!kT? z>(>wbO{EAgvSf@aj#DxW-A(nn<~PIXv?_40uCkGye@#k-3 z_aJG4WEiGEv2na{5o^4pK0EE(D-d+iniL)cO7%xS0bVO`cIHh_=Hr>njO8_{KNy{fe0qFnds&$I5tkCx>=S)&+&skVB@E75*J5WGA^<-8|~_Vxza z7+hXjlgTPSrr2Oa^aO#qk*YNis!8VR$|me2C7Djz@RW{9e70K!Vum^H4!{Bmp|LrQ z93iqOIhCZy1{+)^h!fQ_@w^f1Gpdu|+dzpC{@nwYc>0@n^+|D;)A3{&786>vA8RR~ zLWv*{;VPvKUZmu6onArH^Ufyj0!C_Rg0&xT#zoq(UPYpMf*{dDDlK0Dpwl>d@~-1< z^90xC-QqWQlNUhfO7pSxKv#(>B$Vi@ziIfV#xdB%2Leu-7@$tUKp4inq8AVE33;Ic zfcI%Ub0CSJQ3}l$ZUUPkt)Ta=E5jrMmwWX=LOJgKP+#II6O@Cf)R7^d)2a<7 zwLeR&E8W3}Ba_(NKiL_U`|&7^rNFQTTp#a#8%U;zJx3+luM>yazqMmjl8aC3D5lWe z!lPAaf(}2XMhnB`s!O-YY{GXr=H@zqjSS*T`s7R#8_`~>lhrEpZ|i6SPBx5J ze}$*Sl!i;yao&Da0%2QSSXV4nlE%n*1$Yeh{McmwNH11 zBf4ksMs}QJ+F5_R0=npdHAdhw_ehi`nkN)Zas${atYqO6@Plz)7c02flDyTOA{P!1 z`+`YzzGIl8Srgm2%RAc+eap1FLwRpGGYMX7TKgZ5GW_#F>L0x}sIu%?I({7b#cS>- zz`iQ4+yd0$xfYT~xqh@^LK+nPr8A%KglW1+b-P!Qx-8#7-}xze!>8{Z^?xB&{TC3b z{u^}~5gm#bkcRUy9Siu*(YrmYnu3oY*#l}!~e_~QUO zTRZ01-a9LG8AL)viZq~-N(;ke(fdL5yL;_S^^TbGifz!FVdS#Xh64ZR5eh$1z4*cG z#rfqm+bK0kFXx=Q8ZL(qXZZyTCkQuGn0nt5yKOS;3xbCUI*TR5oaD(~QyG)RmlV_b z&=TiX=&Xpiy13qSNcPSFO>AQ}n$z;Rr4HGQOBSHGnDM=2zIUQCGp6EDVT`y@>$e_lgs|zA^b*e(f=l(52l3mgESvb{Z)xk5}uXJjD$o(vT zCNBQ$yM0tBTO*yRw6}ovpwfrQlA&73iz=N%Ns1Ui7FY=-X*k>~epXUwQ zxbll{oe$@_`Vt}r>`Z?0 zM7fEcot`6gT6rdmvz>fPDo3>&Y@bHY>5Y4thCHZh0yhhd;I&gQSg^S$S8?6qFsT-& z;%GGUUb`;st$_6a)FLF;G{<~m&yDatDPNP7>L4l1lXO%(ybisSxJL(u(?6U5y0Jt% zM=udzzjNXK%oQf0pyAt?lq@x0dfj+u z>YdO~7N1VHTIPd?;;9J(;qwDB{a^o-w?&uvr_P>uB%wYP-Wb8n7G@S&b3^TnHL8-^Po=612VoH1r@A04+l<0XK5anga^#9@O`?+cPFX8nz{!ro1VPOukK_ zRU(|HnvNW3Oa}~fy}GOi_C!Z$k5!r$WvPmP0I@zDI%Rpk{ZQWhk9%;IcQp7&9LJA$PtmJ`o)1zUBH==E%jmMA^w zI4OKYKF4V(*BZS&`&(q*e~B8Zg_+BNF2U1>I^2~G0gv>txMlm8BxBR0<4q$yz07ZW zsTBOk5HOUiYNnA73=HPtG4A!Uf_nv~xDRN3vSb8^8w{FjPUyhXcDW7WY>3hxgJ2=M^PuG)YuJh3K3~8PRP|YPYO~NsoeAQBDH#()M2oh@|6SR`thco7v7!g0yzRBR9HU(NS>#1=xwgmzaOEuaQ^D3V*)*NF7>7{H{Uw` ztaWe?m@TApGkD+ShEcET^qRY8t;08v){70hqyJvygeUD|RP6Hs4J7?}VOJTag=tWR zfB~pgbD&%219yIuxf;7)yA^LHL)UX(bKh$*SE<$g#dWkJND4>$`(1n#(@{aGzSA~$ zx3}V1W1)f<@=?M0bNcFLu{o-J)|UwIdn`9Ae*7>T3hRINv?_ds z|cyVO+0ulAL^+DiyUn28p| z+^Ukpcz8rApI7^qO%J;-EV-xSr)4K-NE7&8&}zQp@)MFGYioPJWi!!I%SjBSq9S$X z-Nhs1KR7VDQt-#AUYX5NYPx@~)01F?e?8-Yjc`I*72xsw*3?(J4frPHNfvB(6 zr*}*6^h}<89-o7J!zdj^$`Tu%nRG%5WnBu zvuL}Nbdc`F?gX=Q;|rH40)VJUp9ozo$O>chY3$2a=ab1}oFI*?gBtT;at6=tR?83D zOE%oZBwuIrx`~SN-Ms~h322F1+wSt|2WLL5@mbK*90#7#XgIC1amUXi4hKAD@P|~> zaNk_`eW2Qk-Il==0XS50=JBfP|1-*pN{t+c)- zQE(U4_e^0RfCb;Z!*PX4&o$$@h**-opn!iZgR%^qgUUnK=08V~6M*usxjZ*-o_rt( zoe3u1fWd#np&fVxDJ$db#Y<3u_E2^@>yTy-Kg=(f(Q`8q!M>-d0>Q6?U%#BFyAM}O zC#+FCg^%L+~s}{Ks*ZLwif8bQ*annyg)===9>R-4@LJjg= zudOqG8tMa&FSscWZz(T7>mqilbq{qf`JT7$%r5a&F_TO+ch`%qwyue1vt+d%b}a=I z8||Qxc$Za>wAQm}FN*fan;FG0EMt8IsW)1%+zhEO7t@W;Day{_PaAi*>H2PG=WBDz z4WwMagzL6}>0K|%Xq&Rj0rLm@t_~CBO`}g@l>;N+>PVyxse9l=wG7(?(YY%|1uf(nd~qBcMs}mE)ab(QEwe1-H7_k1}|D9^1X?X~osao-2p-iXJFDt|*7QUR`DEZGiHYEPhqa30l8c zH2hbiCn#Uw*3X`n6kW*(fUNlg(=c9Qg*O*#Oqq34KLbvDepqq@qyg9@_o@6?+i3cR z?g)7a707ARN7>g=yWIPW=(>(?>qC!BC^5Nz!BV^Rzx03n-$o?eNxjfP>GN)YnlTif z@u}1ejtriab!O%1mC!tRxEakwi9KRwUH!vw!5V3@Lv7wrT@7O2vtgF!8gG(N$tKIy zrJ>_*^o|t^_pNIcoCmcqMVkqkD=OaJ>NZQToG7Tz4i!bI z`5dzxzYiEFw(kU}ehZ}aG=XPu7gk6Nms~?t5)76J zRiq^v%(Qz6@F({IYKj)sbF#;?M5{=Yx@OTvaooPBh7m2`_4jofO`XKlQ5Ey{y{g$d zHjS9=bKs0j&}3(+p4?}KH!iq3`;upVyMovn__NnV>)Sp{7iGwzlm5W7a~*i+jYWO- zz=??phgqk~F*-TWn89}oO7$jhDQT&SN$<2> z0rsx_&;y-mQ^S!%ot7xmap4#8d@kDylaF{z;0u-hJ`~+{en3Qje&*bDo;(RZ4oF2+ zXtCLtnp;HXd>{qL_A0IpnZg@y?x}FeJOIkt9;fB{#!`nuczIA^swizpVI)}<84jzo?s;d zY_n%Svpk-XK6tN`bN}j8>+-8MCYsfD7&@Yl#+^mc|CT93oR_|drcp}j-TWZ?Blj0M z^0%jS{>c4>#{9F$KkM?(Mij--myi`#326|`#r+*%WSE~yT8k;-;iUREc{KlW+wd=U z$p3_^`M=?A*eW!fuJ_zgaSQXHCsy{?UAN>$8f9=fJVeiajQI!pB!ds68?dbXcekjNN$*vMZf_vAM#_3qnkOr zAofJ&2pe-qmp{`_gsHfY&IPBH{7tEamiyVkBaKf6F=s)N!LyB~s#g3im>>_!Auskvj>x^j@FT3#Q9p!FO1FO# z+>jwYf+nzoPlxBf7cHqB3gv@KhIylD0$3m-K-;Vo&lK-_)M(Xi+H4#)%=f=;btb+c zc|{z%Jf5#o7#l1NV;(aZ`l=$qz{9T5aFE?VwMmW>gAy0Nra0D~B&_!|T^JEOx9mxI$MG$nloLq^?KPS)*Y3eZS#xuV+WzuMRu46k9_4rj&5+0vl~;IQ z7cDAN^L1elh(!bTX;Jj2YI=tnEuZdB?+e5f#h&#Hn54M@E$-{yi~ZEEPtr(Bd)LE} z)?fkha==ugumT&5+)Znv)I%wCv>b#Sh|r z%vli5o)S=2?XDd&rpxCq$0fX93n3Q3U`>Sus+mBuAB`Wl z(@#@zlNiJo+zM8CO7alJ6}OEUo^-CV%`qv~8u!gugX}VYQbwrQhM1qt%n!AWbsP(* zT?f+ZP7%rN+l07V+pe>CZ)!1WKWj)m?ik^EuJaRcOS;o!k>N0;zOq=u)29}6;XiH~ z2}~U=y*^fA;Lc|b%SGkW()zr2qT$TK{q<4wb1Wv9Too+#{K2u*dveK7vHkDxB9w}p zrA?!VS-Z#)lTe+-aB+@cnQI!;AWFbf$ZFcLbh9%ux+$k8jZP4KZXGR};I~r>Kx};au5uNev zi3(Eg_qIN6=ge-XtYwNQ@gN78J$ZXD`^pT6nWC9Wa)}szHP_mgF#`2dp|xH64omB9 zN6bg?p8)USx!TZ6@!CDp)WER6bgy4>>A%|JUzE>(4LB#-m=eD##_2l4Arw97gNrt3cuZlhR zNxl>J;Ga}#JiIy6P(9X|Tto&|>WWH@InyY{G58N?*OFVqr32P@B=l-!$2Ypk2Q8h^ z;WT9Bs+yIHz}EERn!4tg!i#$iDMLN0mH?N{@FhWyB`0Lo-eiyf)UW<5`2q->B;rkP z$Brm#a>YcS3m^hesW^M&g9`!BeMugEVBL#D^Sa9QuI=#-CpqXH5B)T2I96KEKH3Px z^aXPMIm3OZ804*8^nIw3kUO(?7+*8st?P0S+*G5WswZtBew$NR;btje9fNk>^$fV4Ikl3zp&N2QVj{F zjqH10XDc=ihE~^gl{N31Xbrj*JZnxkkNMi_nKDs=6J;?Gy8dD1+A03G3&&fhzr|$# zQ3dUPzk~tjpbg5tECQrTzC+Rs1AHsWmH#%pf}_)3=U*zmO<*5~_lSJ(B$@!3q^;clRP1;aR$ ziXWQJ%N-4}H;laFOlqtVIs@DReB~I@dG%g-hWTL>)ft*&M|I?QsKT7Hb^kWj$S07m zb@j;eS*m>uz+}zV=+HUg`mtDECavpSazPMn<_)=9ETF&#bvEHmx7Xz|P`3RZFQl=@ ztKeLc*T@lFThW%Mhu1Ve^rr~hc7ClO(3CrNpZ@6TGIO_t!It`1G-pEAl3x^6j6e^D zc_~JQL>Ug^*7@5(uG4X2z=E;4tsOhxCVROCq(5t)zZYJ|+)nmXda3bthGn!MXW&Da zk66aMsWPie|HeX$P+zl@It3&f2mZpnFVV8))m$!Dea{9%v@JyEJ@iJv zJR&=h7w1*U=wgm0HO!mOs{6lZ4{R)s=(oNe@b(r=jG`L28stlOyS!`*Q3SigfHt7o zDV9lS586IU9r_tb$r`BR4>4I|D>%9z)?#%!LT63}q#MxerK<{1-99jd{utBvyr4j< z+v8i_eD|F!RhQ@;JV`vdi_LiF1?tt~&LhXIHBcAy5ZE%X`xDS2pUFq>7g2s?o2V?( zqq#ul^RbzBZy~y|609p<(p@~OMK-48W|g&R6fiHcl&XG9pO6qG>D0OrRpBhu6xS5{ z1-US9LL*`w;SUwWTB{XRU}dGnM&YJpi(MWGGp(vq}cu^DV)hG_X zZ-`sO8zs3d$=9nr0V{FQ+r1#*1)rx>zb1KW-o~@G$!tS++|x=f$t49B8GhVJJvO~} zaGH)4Re#Z;|(PBPVASR?;r~%PU5|KmJ~E(T?{AWbfw2ER0W9kZvMX9gP}RmAjyH+1QM>gr+<)Odlwmt#B(!1w^heL|m&}7> zeb$-=B>xpwY-`E)=iB?BGl;TGV{1)=#!!H`mFqQ^NZLy?a5?L938o-Y4usG`t5l8;jHR@DjYsf1RqX_ zqO-(zud^lPapX8C&{v!wx;X{GRc)ray{evgTU$L&wxb6Zr^$)!-Y^}3PP0nY2aO7& zH^R_b37))&;7WlXK^J+c&Lu)`e?k-W1k zM$($#u7GZGzQ2%-|1cI-kM$=YAy9f=dLTzV=SFhvC&1$;fCJD|Mjet0ePbF|!DUO_x>w_e$th}<>F_-|;A#h)_!i%PE@8YN z?`7FXAc;BT`DW*c|MDP^Vi`2>l%ia$Pgv<;&sPMG5@Qq-mUp)E(?PA;31HNxEHHKf zU`+u_PLLstvK;LJyfWSc%!%I3n{lrLmD8}hKWZS6_g*VayQ}y*zRT9DI4pRAy4Psp zaaF-ser*%HTH0k=?f#Z9UPIyW#gi)8%|T(9OtuVxSt2hptBYv=&O8)_H+{b93As2=FThzBe~QI z$o$04wZG*C`f!>5W8TLWP5~_kZ}JMm2t51G8cz$Y-f`S!7UR&=F?z*{A~j6U*a%>4PM#yfCUi{E`01MWYA*hI7A5N4nVvw+pEhD7sQ8! zH)F5=a#7K6vnLfM5DI&GvvVVV<@iVXHXEkWrQ+lLwl(RVggweOG&Cg<-CYrR|8qAN zMXYcOyATSU4%-^+3E!CBFieL%{v%ct%lWvgRs}a&kjg44KZ)^aRh+CIBsUf?nOC;B z)LCr&?p^YntO16Rw>W87u0L}kM}_IGluME&$P9d>M4(l_#=by(y@5>?-lM4KJ)(-~ ztsC3>vWru&8>UgTBj?26PMDNY2_Um`IShec*nU^xoENHD@fT`$)`i2z9$%m zOU(aP*f03o-*smD#~9wjhqnSVWVL|I3j$2GIlgT{E%d|;;guZDJ;~g&_snc*c}5u5 z7!YB+k8^JqE1>@h?AHf1+-(PNI^w%XKYAZQ7Qhl0EaR>u%X}l)YdXpw;%D#hXx^q` z!i`*nOTdmLhF`bQ_}gR#+2>~Ce>)0m>l6P{9o5i>$h%@mF5G*qBV zjQ(GEa>Fskj>t3v+lTy13I?YY3`%Y4W z5}J#8*VC!47smd*!@cl27cNK0P)QlWtLqL3E=UW7j<=5vx|4QwRV&KqCwpm1wT$8@ zmg3b#4@gprq)l(t=b@b7sTZhRsd@bI3B!4l=sK>s7(V{%v*(wsmo{+K3~{vpnF0?L3u*b-FHzG4JY8xj)TE5a zwUUdM?@zZKZ>4>>dg*?7v(0dw4dZ}ixW?5o*UW-iUIC08Q`36YX+2|WWiYn%d#|F< zqBd1pSJPGWY3iYUhSERK8_HqFTkBQ2$x>wU=h zlXf>;c9zMS2dF6%O>u{8N6e@H&UL}xTQB@SrI#=L1oVlaZW@J;%E{5Nt{d4IhSUDG zG=Qzrx%0b7(@EfI$WzJ_b2VLv_(u|DmavD!kN9D?S#(92zwr+HBwZt;rw7DUstV)Z z)=e&Y?=wYK8zs1~y?4J3#OO1B@*|=1U909si0a}Il3+5w;cR#A}!m+8kQA{@~jt?s?ua{N)TGSvKM5H=Jv>g}r_$Ie>Q7plMI7cA>TT z4iUN9k;&yv-HX!!>M1kj8Qs*2fPpDm-~F9~&xTD3nkgQw%7%Iiyb!29_#zC|mFM|v zm5Ca!zY=1;FC6M{GkP<~&VUxPgQR;e4db}5(!8A8?#M-^wJ?PS*#W!x{Ua8#J- z15dl1=a39{mz+o}7Z#PsE63mw1fWvj=RF;$4b82tWX;=5l&C7dJ(qk~#PdHj{$fUitGca5c$jKm97Ye03@*UCz0_P%nhxVFLJ+hd z18C9$S8?lHEC! zA?v|_NdH1bmvg`?(i6DLBLa9@q|yL`!&gPNn6J>mHc4E~=uXY}_t1UA3;};(qvUy7 z6#VTlq_x^Kjh2_|t`Z4}p&&sO)}+2izu{gc$} z1UzF*GK2tukNbPatI(Y`RT0+-(4)-K`=j`mqMvx*o0~xC>mz4dLbPAX;*+*xbVU9j zMJWkw6^NGAn;s^^h+ji1vPtBih3f**M1&FaG5jYDm$Co3n+5%~l(hJRYBnkRdMnX! z*WV@W(dw%5zP?0hnQ$Ym8cOY!_y~_&+sr$Tx1889`mlTiU;rJ1jaE3k30|L}QELXh z$35;(P9<@Mny%2sP%wmjiao6|WNe=svJUAi2N2WGPcHgA4|qAGB~W!pztZgHiC)8p zG5j57F4pKTCl(Ho=PN%ZQ~%)@$6v=s6a*kuW$yy9j`-1nz%zYasCde>V%-kFV?tAK(k2D02w}ev?`@sK_A??aN2o0n8NS z{J34|6umu7Gbifmmhz1Mfy#YmJLL{4+EIbseOu-8^XCtedx&H!f%!GDdh1W(E?`sPeT6PbH3kRax0W!_#8Mmnn0iZ(RKl55 zNQy)5_SYjCO8Uq>_in=wH`zOGHNr4w=FLT_Yn_Q*juM13 zoyEj1gEK*h5u(aTSAph0i+gx(nM?;kD?3jT6Z_?1SE z>|CA(HG*;l6wp!x=N@f%s#+UC1<@MP)M6Ek_(avh(@S6q{)i~_cdAxia(sG6&BjVR z;aMZ?`IZurLH7OQyt+f8^`b%+`0RdR5|eUbv|YT`kTHo8UH#-Y=JV{wHO-ekhqryk zc%vvJbKTU7IW&na8c!a=+iG2^z+e?6xD& z(N6W1URb-;Nx8`olS^P2lvQ`=UK`lO?KOg#ySyCt5mR*UNl;eB^ur_E!1p#`V^0t& z2r+=xmOh1eQf@0u`EXdWD=C`oxdNDmE2RGTLLcc`*B!O?QEk0Nk1dIsQuX28TS*bU zR5V%^Jz=boMzsxaFbe!c6@&Ym7-kBD4<{5KHldipto|hsgM)YSP8*`;X?^B*4Qu0f zh}%gtL*o$!v2z*FJWsI#r8E zhv2P7S|3|;6Ev(KeiW*j#dL6-KMfv?7R33Q5M(I?9#@05fs%@ ze$UW)qt8a>uqLaWGy<=0nZAzs{ynpD0isreSSVmQX$H4##U!Y}y}ZNzBe09Z?T&dq zhs@EuEgG54N{gy=oD~;rh+jUUf1H@h@R(sivKt_>&<-qYczjs`cXy!|N~XD>jt((J zAeTG&n`*+0UuB}LSfQAh#oi_p5~bE5#Uap@;`H@<{~3+MeTn{Ce9sc56u3CPUw3S{mKwxgCET;?)mrVP%*mNa;{5Ql}Y1!|XchbMnQU8+`Qh!A8{>}3K9>AoCd29et-B&eM zKZD=CCxVMRx*Yj^VkZq2X_jI-jd)YCbvAkpv*UK5w;xHlFAlY(JnKa%S?=@^y&k#e znBmofjIJ(5RusOl4=#|o)TE)3SpF8m!SG$}nedrqUFc`o!t0#SH=7~#lJBas8WH>u zPvcx=DN?6AKciHTrMs zp01Kz)cfgN6w6eFYJCG;x7+7s+xwU8tG;XtnHGL*n0O34U}U`o3N%z0DUyBI7@W^> z#Wzk=!<<6Ai=tLuCx3@{4fu!^eh_&gSXc1HLaEfk$ut(!Avx*UV^yEn7fb3tWL5^X zX=d>80F*h++~mZVgq6GQ;UcX7}B@YB4da|=B zwt_zQAr%Y3&#Mz@k%*co)*`=@*k%LR!38!Fy<#By2^du{DNnAg=Jhv1Z%z_Fqg6pI zLJ72h$e1c0FlEbO37?96*IH9}@>oj0&cG?H$D@hdmMM3esXD=ABy)dFwM`@?6TNL@ zbK>&@1>6|{puCOO2XNcb%(t65#osPq7(u_CJmc5t8GO1K8t4A-TT~uo-Zh}ZEayumZwgbApDq*fQb{8a<=jsH=}#R(+po%q%L4mo{5F%~Hj)pz&iu~K^yE?y@Hg~wFW@O&Nm;Yn1ra>YbupHI zP!EOTn+av~lYmTf>RBfJglhZA*z5e#NZ1G)rG*TXL{O!|)}#Bt=(peG@9YE@XZs{? ztBCsAanW_yThV;t-vfD#FQK*mhRwiexzd~sM~$kjZ%zcZ$Gn+MJ#tTWONPfx!Z-@n zJd}4#$%p5@W@H*A<@YB^l%nb6y#Ofh?W%FqM=T* zf6ue@KYzFOhed8tNud(>UJ4kA$Cw!u8U;{OP)ZMN$T>$JS>u}xUU#8)&m-S|ksIwT z_gSycLO;j-nfPag{7*K9t(2dD-jV-bIxUODGghzIN zbg`OUNE+Q_m1->Y5JJ)Vbc1dXZ!Y^Ua=ztXidi18ZiIdgt5@H+k$YW zkg{fXBC&2s@^CoSU1vQ$PdS!eQ9AQ!ThtmtA4>yt|JFw-Yl==Na$2-JE6M@~uhaIP zy`|82Ip-l#8M?a_+LDuw?s?L+g*Qjf9j@3gInGrlPB{(gCtZMUdy^5>TKG+bKJ858 z9Hw*KjzF6TX87%oawWI0x8hrQ_e>f7^_Rp}Fi^k`<0xqdSYfCcw*6l4?_Vt!A7=33 zU%&TOCAstOUpnEBY(TjYZ0W-Jd#Gu`@0k@yQ0u4bb+mto9#G$Nf3`e*jd*PKW>i literal 0 HcmV?d00001 diff --git a/voip_sip_webrtc_twilio_bill/static/description/2.jpg b/voip_sip_webrtc_twilio_bill/static/description/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..639dc93d3ededd4dbfc8031777f50f3f5684a44c GIT binary patch literal 45001 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 literal 0 HcmV?d00001 diff --git a/voip_sip_webrtc_twilio_bill/static/description/icon.png b/voip_sip_webrtc_twilio_bill/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eb680ef42534d41fdf2e1d522a0a2cc5b6d9b828 GIT binary patch literal 1373 zcmX|>e>l?#9LG0J$Fd@8VJzd$Z5+obJ3p?>R(?B~{a~4PtCSz#)(}T`4RK`o)%@tF zkP*%Nsr$}Yww)^#Yp7-bVyg$$L`8?12pHE(Bh%XFk0R@3T zFn>Q{n3iQa8En*cFYt*8Eg&)YU_1!aR=8=Esju~hY`=&^5NKPsPT=;i(DT}%dD325 z66yGnq!cFSFo?}O1|&HFhm)*#IypPJd_#c5&1nyf_!IHrsf^d7fmfSZmVIy3>;lym zK@}(1=#aPF5x$|ngy<8tv82w`Ib2S>;NgF$hlt&3SLZiwgbAD9a5lp=30uz6e3#w> zXkJUlQktihZ>=vh+{)_kj9GZRxcYuLuI0v9jH8>ITW)*I9>43rau#t`m*n4So+A}D zE-3`FIDMnHXE=oGq-WTku1HCZ`A9GH!&8)c-}@=b)pEr>a-kbx!BXg2XUjn2~MHu2gyisdmW|;%DbWD_S46 z9Hf02RG}PT1P}`IILHxFihYp6P@Zt)IP(XmaKJV_e@C9_BA0_4W>pkz=PUm}bw@F6 z7*xPCeaKgqoWlNfh}U*lrS-Q{eVLVQj%d=BcmRIW{7s~FlQPe_|F<|;pw zpmX=|k=(85qNP`097N(7f;Ph$xO)nX2b6LcQFNbTpaT%5!+qmNz=C^)E#&1!8|nfU zLSDgMV!`#g!X+8~=9!#3MIHHYy_Ez1yY1Wbnof-D&f6k1@$~_m$xLM+>39i}9HKX-EX51chK{h1x(CGdMa- z=2R2+I6ye{T31^R*ZWA(t_`Z88Dcc%u|E`F$7&xn=0h{Q1S%a?MSnvK#+YXgT~UGf zyjjyMakK=CiAW1-j+uEr_Wto?ia8ml}UPxcndTpysXSE=m@XiL-)qRd0 z_)E({eZVE~>7B%UoI{H8z-fCPf1cLeE8Oou#ipc}C6~(#G<IJh+CwwX44ckqLrc{`_IRTluw}>yqZ*cPnsU>wGce$Or}Rr6ynQPMU#Dv}J86rC%SB3MuN{(aoGwEX5P5+%Ym= z6wVSq7_42g{G9hapWaG=jem-oWsrtmlGKQ6BX~L4U&Katd|U3^ zQ!aNzeSDbVXf};fBZ@yglR|CT4L{Rp#q^++uZ80#YQ(OznQ|*(qnhk3y}Nde_b`zK z6x-$~#H`yiOETs~D<>aSLxMvCpGko?Qx?=PYWSkp%9EOm$c3#+`w+MIc!ddpgtf{m z2&rlah_;BfO%nEPaxZ(wlM(CIdsTMJlrAHf>8=+>gCnE0&ZaY+&7FMZbff@>>g5R< zc(J>uSDJjhZ`*^$fS*GjiI|=MnGfy6A!q>;L}A dKdku*u?|Z6u`vB7@0$wU$bWALQRH(l^DkY3b@2cI literal 0 HcmV?d00001 diff --git a/voip_sip_webrtc_twilio_bill/static/description/index.html b/voip_sip_webrtc_twilio_bill/static/description/index.html new file mode 100644 index 000000000..2d633ae16 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/static/description/index.html @@ -0,0 +1,15 @@ +
    +

    Description

    +Add support for Twilio XML
    +
    +

    Serve Twilio XML

    + +Serves out Twilio XML which directs calls to the callee
    +add "[domain]/twilio/voice" under the request URL
    +

    Import Call Log

    + +Import log of calls made using external SIP clients
    +Access the import button under CRM->VOIP->Twilio Accounts
    +
    +Find a bug or need support? send an email to steven@sythiltech.com.au
    +
    \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/views/res_partner_views.xml b/voip_sip_webrtc_twilio_bill/views/res_partner_views.xml new file mode 100644 index 000000000..488480a22 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/views/res_partner_views.xml @@ -0,0 +1,18 @@ + + + + + res.partner SIP + res.partner + + + + + + + + + + \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/views/voip_call_views.xml b/voip_sip_webrtc_twilio_bill/views/voip_call_views.xml new file mode 100644 index 000000000..96dd34215 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/views/voip_call_views.xml @@ -0,0 +1,70 @@ + + + + + voip.call view form + voip.call + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + voip.call view tree + voip.call + + + + + + + + + + + + + + + + + + + Call Log + voip.call + tree,form + +

    + No Calls +

    +
    +
    + +
    \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/views/voip_sip_webrtc_twilio_bill_templates.xml b/voip_sip_webrtc_twilio_bill/views/voip_sip_webrtc_twilio_bill_templates.xml new file mode 100644 index 000000000..ecca0bf58 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/views/voip_sip_webrtc_twilio_bill_templates.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/voip_sip_webrtc_twilio_bill/views/voip_twilio_invoice_views.xml b/voip_sip_webrtc_twilio_bill/views/voip_twilio_invoice_views.xml new file mode 100644 index 000000000..bc811fdd3 --- /dev/null +++ b/voip_sip_webrtc_twilio_bill/views/voip_twilio_invoice_views.xml @@ -0,0 +1,28 @@ + + + + + + + voip.twilio.invoice form view + voip.twilio.invoice + +
    + + + + + \n" - html_output += " \n" + html_output += "
    \n" + html_output += " \n" + html_output += "
    \n" html_output += "\n" diff --git a/html_form_builder/doc/changelog.rst b/html_form_builder/doc/changelog.rst index 054b3a37d..bfad4be49 100644 --- a/html_form_builder/doc/changelog.rst +++ b/html_form_builder/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.0.6 +====== +* Fix input group generating incorrect html + v1.0.5 ====== * Textboxes now add the required attribute From b321fca5ec1c88e7ff5f39ddfd7c5a29b55eb435 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Mon, 6 Aug 2018 19:31:33 +1000 Subject: [PATCH 088/228] * No presence bug fix * No presence bug fix --- voip_sip_webrtc/__manifest__.py | 2 +- voip_sip_webrtc/doc/changelog.rst | 4 +++ voip_sip_webrtc/models/voip_server.py | 36 ++++++++++++++------------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/voip_sip_webrtc/__manifest__.py b/voip_sip_webrtc/__manifest__.py index 22f17b468..2a9fb6c54 100644 --- a/voip_sip_webrtc/__manifest__.py +++ b/voip_sip_webrtc/__manifest__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- { 'name': "Voip Communication", - 'version': "1.1.2", + 'version': "1.1.3", 'author': "Sythil Tech", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/voip_sip_webrtc/doc/changelog.rst b/voip_sip_webrtc/doc/changelog.rst index cfac087db..28ad9de0b 100644 --- a/voip_sip_webrtc/doc/changelog.rst +++ b/voip_sip_webrtc/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.1.3 +====== +* No presence bug fix + v1.1.2 ====== * RTP data is now saved if call recording setting is ticked diff --git a/voip_sip_webrtc/models/voip_server.py b/voip_sip_webrtc/models/voip_server.py index 38477c7dc..b2628a5e8 100644 --- a/voip_sip_webrtc/models/voip_server.py +++ b/voip_sip_webrtc/models/voip_server.py @@ -36,23 +36,25 @@ def user_list(self, **kw): utc = datetime.datetime.strptime(presence_user.last_presence, DEFAULT_SERVER_DATETIME_FORMAT) utc = utc.replace(tzinfo=tz.gettz('UTC')) local_time = utc.astimezone(to_zone) - last_activity_diff = datetime.datetime.now() - fields.Datetime.from_string(presence_user.user_id.last_web_client_activity_datetime) - - last_activity_ago = "unknown" - if last_activity_diff.total_seconds() < 60: - #Under 1 minute - last_activity_ago = "Active " + str(math.floor(last_activity_diff.total_seconds())) + " seconds ago" - elif last_activity_diff.total_seconds() < 3600: - #Under 1 hour - last_activity_ago = "Active " + str(math.floor(last_activity_diff.total_seconds() / 60)) + " minutes ago" - elif last_activity_diff.total_seconds() < 86400: - #Under 1 day - last_activity_ago = "Active " + str(math.floor(last_activity_diff.total_seconds() / 3600)) + " hours ago" - else: - #We won't go into weeks / months years - last_activity_ago = "Active " + str(last_activity_diff.days) + " days ago" - - user_list.append({'name': presence_user.user_id.name, 'partner_id':presence_user.user_id.partner_id.id, 'status': presence_user.user_id.im_status, 'last_presence': local_time.strftime("%a %I:%M %p"), 'last_activity_ago': last_activity_ago}) + + if presence_user.user_id.last_web_client_activity_datetime: + last_activity_diff = datetime.datetime.now() - fields.Datetime.from_string(presence_user.user_id.last_web_client_activity_datetime) + + last_activity_ago = "unknown" + if last_activity_diff.total_seconds() < 60: + #Under 1 minute + last_activity_ago = "Active " + str(math.floor(last_activity_diff.total_seconds())) + " seconds ago" + elif last_activity_diff.total_seconds() < 3600: + #Under 1 hour + last_activity_ago = "Active " + str(math.floor(last_activity_diff.total_seconds() / 60)) + " minutes ago" + elif last_activity_diff.total_seconds() < 86400: + #Under 1 day + last_activity_ago = "Active " + str(math.floor(last_activity_diff.total_seconds() / 3600)) + " hours ago" + else: + #We won't go into weeks / months years + last_activity_ago = "Active " + str(last_activity_diff.days) + " days ago" + + user_list.append({'name': presence_user.user_id.name, 'partner_id':presence_user.user_id.partner_id.id, 'status': presence_user.user_id.im_status, 'last_presence': local_time.strftime("%a %I:%M %p"), 'last_activity_ago': last_activity_ago}) return user_list From 05f6299cc08e3146b9b80e5734f3cb20f642bdc1 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Thu, 16 Aug 2018 08:02:08 +1000 Subject: [PATCH 089/228] * Compatablility fix for version 1.3.1 * Compatablility fix for version 1.3.1 --- website_support_analytic_timesheets/__manifest__.py | 2 +- website_support_analytic_timesheets/doc/changelog.rst | 4 ++++ .../models/account_analytic_line.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/website_support_analytic_timesheets/__manifest__.py b/website_support_analytic_timesheets/__manifest__.py index 6654d666b..41ba5ba63 100644 --- a/website_support_analytic_timesheets/__manifest__.py +++ b/website_support_analytic_timesheets/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Website Help Desk / Support Ticket - Analytic Timesheets", - 'version': "1.0.5", + 'version': "1.0.6", 'author': "Sythil Tech", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/website_support_analytic_timesheets/doc/changelog.rst b/website_support_analytic_timesheets/doc/changelog.rst index 8b72bdd98..3fc74590b 100644 --- a/website_support_analytic_timesheets/doc/changelog.rst +++ b/website_support_analytic_timesheets/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.0.6 +====== +* Compatablility fix for version 1.3.1 + v1.0.5 ====== * Report that breaks down activities by day and tech diff --git a/website_support_analytic_timesheets/models/account_analytic_line.py b/website_support_analytic_timesheets/models/account_analytic_line.py index 8a1339119..67facefce 100644 --- a/website_support_analytic_timesheets/models/account_analytic_line.py +++ b/website_support_analytic_timesheets/models/account_analytic_line.py @@ -7,7 +7,7 @@ class WebsiteSupportTicketInheritAccountAnalyticLine(models.Model): support_ticket_id = fields.Many2one('website.support.ticket', string="Support Ticket") person_name = fields.Char(related="support_ticket_id.person_name", string="Customer Name") - ticket_number_display = fields.Char(related="support_ticket_id.ticket_number_display", string="Ticket Number") + ticket_number_display = fields.Char(related="support_ticket_id.ticket_number", string="Ticket Number") state = fields.Many2one('website.support.ticket.states', readonly=True, related="support_ticket_id.state", string="State") open_time = fields.Datetime(related="support_ticket_id.create_date", string="Open Time") close_time = fields.Datetime(related="support_ticket_id.close_time", string="Close Time") From 5bf1b0a1f7838d9c513788af762b7f7f94ee9810 Mon Sep 17 00:00:00 2001 From: Uladzislau Vasilyeu Date: Sun, 19 Aug 2018 21:30:01 +0300 Subject: [PATCH 090/228] Fixed problem with pedantic sip option --- voip_sip_webrtc/models/sip.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/voip_sip_webrtc/models/sip.py b/voip_sip_webrtc/models/sip.py index 715770d13..7041c58fc 100644 --- a/voip_sip_webrtc/models/sip.py +++ b/voip_sip_webrtc/models/sip.py @@ -24,6 +24,7 @@ def __init__(self, ip, username, domain, password, auth_username=False, outbound self.outbound_proxy = outbound_proxy self.account_port = account_port self.display_name = display_name + self.tag = str(random.randint(0,2**31)) self.call_accepted = EventHook() self.call_rejected = EventHook() self.call_ended = EventHook() @@ -136,7 +137,7 @@ def send_sip_register(self, register_address, register_frequency=3600): register_string += "Max-Forwards: 70\r\n" register_string += "Contact: \r\n" register_string += 'To: "' + str(self.display_name) + '"\r\n" - register_string += 'From: "' + str(self.display_name) + '"\r\n" + register_string += 'From: "' + str(self.display_name) + '";tag=" + self.tag + "\r\n" register_string += "Call-ID: " + str(call_id) + "\r\n" register_string += "CSeq: 1 REGISTER\r\n" register_string += "Expires: " + str(register_frequency) + "\r\n" @@ -385,4 +386,4 @@ def fire(self, *args, **keywargs): def clearObjectHandlers(self, inObject): for theHandler in self.__handlers: if theHandler.im_self == inObject: - self -= theHandler \ No newline at end of file + self -= theHandler From 3611314a5f604f8108acd9a649d7d674aef67887 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Wed, 22 Aug 2018 20:15:00 +1000 Subject: [PATCH 091/228] * Assigned user filter for internal users (employees) only * Assigned user filter for internal users (employees) only --- website_support/__manifest__.py | 2 +- website_support/doc/changelog.rst | 4 ++++ website_support/views/website_support_ticket_views.xml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/website_support/__manifest__.py b/website_support/__manifest__.py index 753d10536..7574e0575 100644 --- a/website_support/__manifest__.py +++ b/website_support/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Website Help Desk / Support Ticket", - 'version': "1.3.1", + 'version': "1.3.2", 'author': "Sythil Tech, Adaptive City", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/website_support/doc/changelog.rst b/website_support/doc/changelog.rst index 328547b2a..f3f404024 100644 --- a/website_support/doc/changelog.rst +++ b/website_support/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.3.2 +====== +* Assigned user filter for internal users (employees) only + v1.3.1 ====== * Remove dependency on CRM module diff --git a/website_support/views/website_support_ticket_views.xml b/website_support/views/website_support_ticket_views.xml index a732c21b2..6d29689a1 100644 --- a/website_support/views/website_support_ticket_views.xml +++ b/website_support/views/website_support_ticket_views.xml @@ -32,7 +32,7 @@
    - + From 2416afa26e67ebf61367cca2dfc040788180ab89 Mon Sep 17 00:00:00 2001 From: Uladzislau Vasilyeu Date: Thu, 23 Aug 2018 17:54:00 +0300 Subject: [PATCH 092/228] Fixed problem with Record-Route in sip protocol --- voip_sip_webrtc/models/sip.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/voip_sip_webrtc/models/sip.py b/voip_sip_webrtc/models/sip.py index 7041c58fc..a5da1af2e 100644 --- a/voip_sip_webrtc/models/sip.py +++ b/voip_sip_webrtc/models/sip.py @@ -82,8 +82,9 @@ def answer_call(self, sip_invite, sdp): reply += "SIP/2.0 200 OK\r\n" for (via_heading) in re.findall(r'Via: (.*?)\r\n', sip_invite): reply += "Via: " + via_heading + "\r\n" - record_route = re.findall(r'Record-Route: (.*?)\r\n', sip_invite)[0] - reply += "Record-Route: " + record_route + "\r\n" + record_route = re.findall(r'Record-Route: (.*?)\r\n', sip_invite) + if record_route: + reply += "Record-Route: " + record_route[0] + "\r\n" reply += "Contact: \r\n" reply += "To: " + call_to + "\r\n" reply += "From: " + call_from + "\r\n" @@ -302,8 +303,9 @@ def sip_listener(self): ringing += "SIP/2.0 180 Ringing\r\n" for (via_heading) in re.findall(r'Via: (.*?)\r\n', data): ringing += "Via: " + via_heading + "\r\n" - record_route = re.findall(r'Record-Route: (.*?)\r\n', data)[0] - ringing += "Record-Route: " + record_route + "\r\n" + record_route = re.findall(r'Record-Route: (.*?)\r\n', data) + if record_route: + ringing += "Record-Route: " + record_route[0] + "\r\n" ringing += "Contact: \r\n" ringing += "To: " + call_to + "\r\n" ringing += "From: " + call_from + "\r\n" @@ -331,7 +333,6 @@ def sip_listener(self): if cseq_type == "INVITE": cseq_number = cseq.split(" ")[0] contact_header = re.findall(r'Contact: <(.*?)>\r\n', data)[0] - record_route = re.findall(r'Record-Route: (.*?)\r\n', data)[0] call_from = re.findall(r'From: (.*?)\r\n', data)[0] call_to = re.findall(r'To: (.*?)\r\n', data)[0] call_id = re.findall(r'Call-ID: (.*?)\r\n', data)[0] @@ -341,7 +342,9 @@ def sip_listener(self): reply += "ACK " + contact_header + " SIP/2.0\r\n" reply += "Via: SIP/2.0/UDP " + str(self.ip) + ":" + str(self.bind_port) + ";rport\r\n" reply += "Max-Forwards: 70\r\n" - reply += "Route: " + record_route + "\r\n" + record_route = re.findall(r'Record-Route: (.*?)\r\n', data) + if record_route: + reply += "Route: " + record_route[0] + "\r\n" reply += "Contact: \r\n" reply += 'To: ' + call_to + "\r\n" reply += "From: " + call_from + "\r\n" From 6635ac6e5dc1e1a33f372b5423dbc4b36a72c2cc Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Mon, 10 Sep 2018 09:30:39 +1000 Subject: [PATCH 093/228] * Fix form javascript public access issue * Fix form javascript public access issue --- html_form_builder/__manifest__.py | 2 +- html_form_builder/doc/changelog.rst | 4 + .../static/src/js/html.form.builder.js | 146 +++++++++++++++++ .../js/html.form.builder.snippets.editor.js | 147 ------------------ 4 files changed, 151 insertions(+), 148 deletions(-) diff --git a/html_form_builder/__manifest__.py b/html_form_builder/__manifest__.py index 95d2dbc2a..373973637 100644 --- a/html_form_builder/__manifest__.py +++ b/html_form_builder/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "HTML Form Builder", - 'version': "1.0.6", + 'version': "1.0.7", 'author': "Sythil Tech", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/html_form_builder/doc/changelog.rst b/html_form_builder/doc/changelog.rst index bfad4be49..ad7b371e6 100644 --- a/html_form_builder/doc/changelog.rst +++ b/html_form_builder/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.0.7 +====== +* Fix form javascript public access issue + v1.0.6 ====== * Fix input group generating incorrect html diff --git a/html_form_builder/static/src/js/html.form.builder.js b/html_form_builder/static/src/js/html.form.builder.js index dbdb3c701..eea652b75 100644 --- a/html_form_builder/static/src/js/html.form.builder.js +++ b/html_form_builder/static/src/js/html.form.builder.js @@ -1,11 +1,157 @@ odoo.define('html_form_builder.front', function (require) { 'use strict'; +var ajax = require('web.ajax'); + $(function() { //Load the token via javascript since Odoo has issue with request.csrf_token() inside snippets $(".html_form input[name='csrf_token']").val(odoo.csrf_token); + $( ".html_form button.btn-lg" ).click(function(e) { + + e.preventDefault(); // Prevent the default submit behavior + + var my_form = $(".html_form form"); + + $(".html_form form input").each(function( index ) { + pattern = $( this ).attr('pattern'); + if (typeof pattern !== typeof undefined && pattern !== false) { + var pattern = new RegExp( pattern ); + var valid = pattern.test( $( this ).val() ); + //Why does this always return true?!? + } + + }); + + + // Prepare form inputs + var form_data = my_form.serializeArray(); + + var form_values = {}; + _.each(form_data, function(input) { + if (input.name in form_values) { + // If a value already exists for this field, + // we are facing a x2many field, so we store + // the values in an array. + if (Array.isArray(form_values[input.name])) { + form_values[input.name].push(input.value); + } else { + form_values[input.name] = [form_values[input.name], input.value]; + } + } else { + if (input.value != '') { + form_values[input.name] = input.value; + } + } + }); + + //Input groups are added differently + var input_groups = my_form.find(".hff_input_group") + input_groups.each(function( index ) { + var html_name = $( this ).attr("data-html-name"); + var input_group_list = []; + input_group_list = []; + var row_string = ""; + var row_counter = 0; + + //Go through each row(exlcuding the add button row) + var input_group_row = $( this ).find(".row.form-group") + input_group_row.each(function( index ) { + + var input_group_row_list = []; + input_group_row_list = []; + var input_string = ""; + var row_values = {}; + row_counter += 1; + + //Go through each input in the row + $( this ).find("input").each(function( index ) { + var my_key = $( this ).attr('data-sub-field-name'); + var my_value = $( this ).val(); + + + if ($( this ).attr('type') == "file") { + if (my_value != "") { + + $.each($(this).prop('files'), function(index, file) { + //Post the file directly since we can't strinify it + var post_name = html_name + "_" + row_counter + "_" + my_key; + form_values[post_name] = file; + + row_values[my_key] = post_name; + }); + + } + } else { + if (my_value != "") { + row_values[my_key] = my_value; + } + } + }); + + //Go through each selection in the row + $( this ).find("select").each(function( index ) { + var my_key = $( this ).attr('data-sub-field-name'); + var my_value = $( this ).val(); + + if (my_value != "") { + row_values[my_key] = my_value; + } + }); + + if(! jQuery.isEmptyObject(row_values) ) { + input_group_list.push(row_values); + } + + }); + + if (input_group_list.length > 0) { + form_values[html_name] = JSON.stringify(input_group_list); + } + + }); + + //Have to get the files manually + _.each(my_form.find('input[type=file]'), function(input) { + $.each($(input).prop('files'), function(index, file) { + form_values[input.name] = file; + }); + }); + + form_values['is_ajax_post'] = "Yes"; + + // Post form and handle result + ajax.post(my_form.attr('action'), form_values).then(function(result_data) { + + try { + result_data = $.parseJSON(result_data); + } catch(err) { + alert("An error has occured during the submittion of your form data\n" + result_data); + } + + + if (result_data.status == "error") { + for (var i = 0; i < result_data.errors.length; i++) { + //Find the field and make it displays as an error + var input = my_form.find("input[name='" + result_data.errors[i].html_name + "']"); + var parent_div = input.parent("div"); + + //Remove any existing help block + parent_div.find(".help-block").remove(); + + //Insert help block + input.after("" + result_data.errors[i].error_messsage + ""); + parent_div.addClass("has-error"); + } + } else if (result_data.status == "success") { + window.location = result_data.redirect_url; + } + + }); + + }); + }); }); \ No newline at end of file diff --git a/html_form_builder/static/src/js/html.form.builder.snippets.editor.js b/html_form_builder/static/src/js/html.form.builder.snippets.editor.js index 74faf22a8..1000564e5 100644 --- a/html_form_builder/static/src/js/html.form.builder.snippets.editor.js +++ b/html_form_builder/static/src/js/html.form.builder.snippets.editor.js @@ -15,153 +15,6 @@ var weContext = require('web_editor.context'); ajax.loadXML('/html_form_builder/static/src/xml/html_form_modal30.xml', qweb); -$(function() { - - $( ".html_form button.btn-lg" ).click(function(e) { - - e.preventDefault(); // Prevent the default submit behavior - - var my_form = $(".html_form form"); - - $(".html_form form input").each(function( index ) { - pattern = $( this ).attr('pattern'); - if (typeof pattern !== typeof undefined && pattern !== false) { - var pattern = new RegExp( pattern ); - var valid = pattern.test( $( this ).val() ); - //Why does this always return true?!? - } - - }); - - - // Prepare form inputs - var form_data = my_form.serializeArray(); - - var form_values = {}; - _.each(form_data, function(input) { - if (input.name in form_values) { - // If a value already exists for this field, - // we are facing a x2many field, so we store - // the values in an array. - if (Array.isArray(form_values[input.name])) { - form_values[input.name].push(input.value); - } else { - form_values[input.name] = [form_values[input.name], input.value]; - } - } else { - if (input.value != '') { - form_values[input.name] = input.value; - } - } - }); - - //Input groups are added differently - var input_groups = my_form.find(".hff_input_group") - input_groups.each(function( index ) { - var html_name = $( this ).attr("data-html-name"); - var input_group_list = []; - input_group_list = []; - var row_string = ""; - var row_counter = 0; - - //Go through each row(exlcuding the add button row) - var input_group_row = $( this ).find(".row.form-group") - input_group_row.each(function( index ) { - - var input_group_row_list = []; - input_group_row_list = []; - var input_string = ""; - var row_values = {}; - row_counter += 1; - - //Go through each input in the row - $( this ).find("input").each(function( index ) { - var my_key = $( this ).attr('data-sub-field-name'); - var my_value = $( this ).val(); - - - if ($( this ).attr('type') == "file") { - if (my_value != "") { - - $.each($(this).prop('files'), function(index, file) { - //Post the file directly since we can't strinify it - var post_name = html_name + "_" + row_counter + "_" + my_key; - form_values[post_name] = file; - - row_values[my_key] = post_name; - }); - - } - } else { - if (my_value != "") { - row_values[my_key] = my_value; - } - } - }); - - //Go through each selection in the row - $( this ).find("select").each(function( index ) { - var my_key = $( this ).attr('data-sub-field-name'); - var my_value = $( this ).val(); - - if (my_value != "") { - row_values[my_key] = my_value; - } - }); - - if(! jQuery.isEmptyObject(row_values) ) { - input_group_list.push(row_values); - } - - }); - - if (input_group_list.length > 0) { - form_values[html_name] = JSON.stringify(input_group_list); - } - - }); - - //Have to get the files manually - _.each(my_form.find('input[type=file]'), function(input) { - $.each($(input).prop('files'), function(index, file) { - form_values[input.name] = file; - }); - }); - - form_values['is_ajax_post'] = "Yes"; - - // Post form and handle result - ajax.post(my_form.attr('action'), form_values).then(function(result_data) { - - try { - result_data = $.parseJSON(result_data); - } catch(err) { - alert("An error has occured during the submittion of your form data\n" + result_data); - } - - - if (result_data.status == "error") { - for (var i = 0; i < result_data.errors.length; i++) { - //Find the field and make it displays as an error - var input = my_form.find("input[name='" + result_data.errors[i].html_name + "']"); - var parent_div = input.parent("div"); - - //Remove any existing help block - parent_div.find(".help-block").remove(); - - //Insert help block - input.after("" + result_data.errors[i].error_messsage + ""); - parent_div.addClass("has-error"); - } - } else if (result_data.status == "success") { - window.location = result_data.redirect_url; - } - - }); - - }); -}); - options.registry.html_form_builder = options.Class.extend({ onBuilt: function() { var self = this; From f309eab7622eda95416bffe0ca1c8fa5aba2847d Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Mon, 10 Sep 2018 16:08:08 +1000 Subject: [PATCH 094/228] * Add close date to customer website portal * Add close date to customer website portal --- website_support/__manifest__.py | 2 +- website_support/doc/changelog.rst | 4 ++++ website_support/views/website_support_ticket_templates.xml | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/website_support/__manifest__.py b/website_support/__manifest__.py index 7574e0575..ab4d4551d 100644 --- a/website_support/__manifest__.py +++ b/website_support/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Website Help Desk / Support Ticket", - 'version': "1.3.2", + 'version': "1.3.3", 'author': "Sythil Tech, Adaptive City", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/website_support/doc/changelog.rst b/website_support/doc/changelog.rst index f3f404024..06f75dffa 100644 --- a/website_support/doc/changelog.rst +++ b/website_support/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.3.3 +====== +* Add close date to customer website portal + v1.3.2 ====== * Assigned user filter for internal users (employees) only diff --git a/website_support/views/website_support_ticket_templates.xml b/website_support/views/website_support_ticket_templates.xml index 414733b17..6ad6b8c66 100644 --- a/website_support/views/website_support_ticket_templates.xml +++ b/website_support/views/website_support_ticket_templates.xml @@ -140,9 +140,9 @@
    - + - +
    BySubjectCategoryStateCreate Date
    BySubjectCategoryStateCreate DateClose Date
    From 340f47b4331d308d3f3a4f6a547890f85de3ae08 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Tue, 11 Sep 2018 09:57:51 +1000 Subject: [PATCH 095/228] * Ability to limit which user groups can select a category * Ability to limit which user groups can select a category --- website_support/__manifest__.py | 2 +- website_support/controllers/main.py | 8 +++++++- website_support/doc/changelog.rst | 4 ++++ website_support/models/website_support_ticket.py | 1 + .../views/website_support_ticket_categories_views.xml | 1 + 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/website_support/__manifest__.py b/website_support/__manifest__.py index ab4d4551d..8f98e4c82 100644 --- a/website_support/__manifest__.py +++ b/website_support/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Website Help Desk / Support Ticket", - 'version': "1.3.3", + 'version': "1.3.4", 'author': "Sythil Tech, Adaptive City", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/website_support/controllers/main.py b/website_support/controllers/main.py index 96b3ababb..a42db7c9f 100644 --- a/website_support/controllers/main.py +++ b/website_support/controllers/main.py @@ -264,13 +264,19 @@ def support_submit_ticket(self, **kw): if http.request.env.user.name != "Public user": person_name = http.request.env.user.name + category_access = [] + for category_permission in http.request.env.user.groups_id: + category_access.append(category_permission.id) + + ticket_categories = http.request.env['website.support.ticket.categories'].sudo().search(['|',('access_group_ids','in', category_access), ('access_group_ids','=',False)]) + setting_google_recaptcha_active = request.env['ir.default'].get('website.support.settings', 'google_recaptcha_active') setting_google_captcha_client_key = request.env['ir.default'].get('website.support.settings', 'google_captcha_client_key') setting_max_ticket_attachments = request.env['ir.default'].get('website.support.settings', 'max_ticket_attachments') setting_max_ticket_attachment_filesize = request.env['ir.default'].get('website.support.settings', 'max_ticket_attachment_filesize') setting_allow_website_priority_set = request.env['ir.default'].get('website.support.settings', 'allow_website_priority_set') - return http.request.render('website_support.support_submit_ticket', {'categories': http.request.env['website.support.ticket.categories'].sudo().search([]), 'priorities': http.request.env['website.support.ticket.priority'].sudo().search([]), 'person_name': person_name, 'email': http.request.env.user.email, 'setting_max_ticket_attachments': setting_max_ticket_attachments, 'setting_max_ticket_attachment_filesize': setting_max_ticket_attachment_filesize, 'setting_google_recaptcha_active': setting_google_recaptcha_active, 'setting_google_captcha_client_key': setting_google_captcha_client_key, 'setting_allow_website_priority_set': setting_allow_website_priority_set}) + return http.request.render('website_support.support_submit_ticket', {'categories': ticket_categories, 'priorities': http.request.env['website.support.ticket.priority'].sudo().search([]), 'person_name': person_name, 'email': http.request.env.user.email, 'setting_max_ticket_attachments': setting_max_ticket_attachments, 'setting_max_ticket_attachment_filesize': setting_max_ticket_attachment_filesize, 'setting_google_recaptcha_active': setting_google_recaptcha_active, 'setting_google_captcha_client_key': setting_google_captcha_client_key, 'setting_allow_website_priority_set': setting_allow_website_priority_set}) @http.route('/support/feedback/process/', type="http", auth="public", website=True) def support_feedback(self, help_page, **kw): diff --git a/website_support/doc/changelog.rst b/website_support/doc/changelog.rst index 06f75dffa..474a0df4e 100644 --- a/website_support/doc/changelog.rst +++ b/website_support/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.3.4 +====== +* Ability to limit which user groups can select a category + v1.3.3 ====== * Add close date to customer website portal diff --git a/website_support/models/website_support_ticket.py b/website_support/models/website_support_ticket.py index da436ecd0..54d599354 100644 --- a/website_support/models/website_support_ticket.py +++ b/website_support/models/website_support_ticket.py @@ -433,6 +433,7 @@ class WebsiteSupportTicketCategories(models.Model): sequence = fields.Integer(string="Sequence") name = fields.Char(required=True, translate=True, string='Category Name') cat_user_ids = fields.Many2many('res.users', string="Category Users") + access_group_ids = fields.Many2many('res.groups', string="Access Groups", help="Restrict which users can select the category on the website form, none = everyone") @api.model def create(self, values): diff --git a/website_support/views/website_support_ticket_categories_views.xml b/website_support/views/website_support_ticket_categories_views.xml index 2568fb7c3..ef5a1cccf 100644 --- a/website_support/views/website_support_ticket_categories_views.xml +++ b/website_support/views/website_support_ticket_categories_views.xml @@ -10,6 +10,7 @@ + From bc7e188f066d7948097d32023bdf2f05745b69cc Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Tue, 11 Sep 2018 14:12:03 +1000 Subject: [PATCH 096/228] * Fix business hours field missing resource module dependacy * Fix business hours field missing resource module dependacy --- website_support/__manifest__.py | 4 ++-- website_support/doc/changelog.rst | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/website_support/__manifest__.py b/website_support/__manifest__.py index 8f98e4c82..dcef98a12 100644 --- a/website_support/__manifest__.py +++ b/website_support/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Website Help Desk / Support Ticket", - 'version': "1.3.4", + 'version': "1.3.5", 'author': "Sythil Tech, Adaptive City", 'category': "Tools", 'support': "steven@sythiltech.com.au", @@ -40,7 +40,7 @@ 'security/ir.model.access.csv', ], 'demo': [], - 'depends': ['mail','web', 'website'], + 'depends': ['mail','web', 'website','resource'], 'images':[ 'static/description/3.jpg', 'static/description/1.jpg', diff --git a/website_support/doc/changelog.rst b/website_support/doc/changelog.rst index 474a0df4e..cd09bcaa3 100644 --- a/website_support/doc/changelog.rst +++ b/website_support/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.3.5 +====== +* Fix business hours field missing resource module dependacy + v1.3.4 ====== * Ability to limit which user groups can select a category From 2e7cf836d7d0c7f24bc93a66d8f948bea0d0603c Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Wed, 12 Sep 2018 10:19:19 +1000 Subject: [PATCH 097/228] * User accounts created through the create account link are now added to the portal group instead of the public group to resolve login issue * User accounts created through the create account link are now added to the portal group instead of the public group to resolve login issues --- website_support/__manifest__.py | 2 +- website_support/controllers/main.py | 6 +++--- website_support/doc/changelog.rst | 4 ++++ website_support/static/description/index.html | 4 +++- .../views/website_support_ticket_templates.xml | 10 +++++----- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/website_support/__manifest__.py b/website_support/__manifest__.py index dcef98a12..9b77df63d 100644 --- a/website_support/__manifest__.py +++ b/website_support/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Website Help Desk / Support Ticket", - 'version': "1.3.5", + 'version': "1.3.6", 'author': "Sythil Tech, Adaptive City", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/website_support/controllers/main.py b/website_support/controllers/main.py index a42db7c9f..ce2731a7f 100644 --- a/website_support/controllers/main.py +++ b/website_support/controllers/main.py @@ -209,9 +209,9 @@ def support_account_create_process(self, **kw): support_group = request.env['ir.model.data'].sudo().get_object('website_support', 'support_group') support_group.users = [(4, new_user.id)] - #Also add them to the public group so they can access the website - public_group = request.env['ir.model.data'].sudo().get_object('base', 'group_public') - public_group.users = [(4, new_user.id)] + #Also add them to the portal group so they can access the website + group_portal = request.env['ir.model.data'].sudo().get_object('base','group_portal') + group_portal.users = [(4, new_user.id)] #Automatically sign the new user in request.cr.commit() # as authenticate will use its own cursor we need to commit the current transaction diff --git a/website_support/doc/changelog.rst b/website_support/doc/changelog.rst index cd09bcaa3..ef08389cb 100644 --- a/website_support/doc/changelog.rst +++ b/website_support/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.3.6 +====== +* User accounts created through the create account link are now added to the portal group instead of the public group to resolve login issues + v1.3.5 ====== * Fix business hours field missing resource module dependacy diff --git a/website_support/static/description/index.html b/website_support/static/description/index.html index 61cd6c28e..edfbc9151 100644 --- a/website_support/static/description/index.html +++ b/website_support/static/description/index.html @@ -1,7 +1,9 @@

    Description

    A helpdesk / support ticket system for your website
    -
    +

    Basic Configuration

    +A user must be assigned to the Support Staff or Support Manager Group before they can access the Customer Support top menu
    +

    Configure Support Ticket System

    diff --git a/website_support/views/website_support_ticket_templates.xml b/website_support/views/website_support_ticket_templates.xml index 6ad6b8c66..ffd82f511 100644 --- a/website_support/views/website_support_ticket_templates.xml +++ b/website_support/views/website_support_ticket_templates.xml @@ -94,16 +94,16 @@ \ No newline at end of file diff --git a/sms_frame_mass_sms/views/sms_mass_views.xml b/sms_frame_mass_sms/views/sms_mass_views.xml new file mode 100644 index 000000000..6dd04dce5 --- /dev/null +++ b/sms_frame_mass_sms/views/sms_mass_views.xml @@ -0,0 +1,131 @@ + + + + + + SMS history (Failed) + sms.message + form + kanban,tree,form + [('status_code', '=', 'failed'),('mass_sms_id','=',active_id)] + +

    SMS History

    +
    +
    + + + SMS history (Queued) + sms.message + form + kanban,tree,form + [('status_code', '=', 'queued'),('mass_sms_id','=',active_id)] + +

    SMS History

    +
    +
    + + + SMS history (Sent) + sms.message + form + kanban,tree,form + [('status_code', '=', 'successful'),('mass_sms_id','=',active_id)] + +

    SMS History

    +
    +
    + + + SMS history (Delivered) + sms.message + form + kanban,tree,form + [('status_code', '=', 'DELIVRD'),('mass_sms_id','=',active_id)] + +

    SMS History

    +
    +
    + + + sms mass view + sms.mass + +
    +
    +
    + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + sms mass tree view + sms.mass + + + + + + + + + + + Send Mass SMS + sms.mass + form + tree,form + +

    + Start mass SMS. +

    +
    +
    + + + + +
    +
    \ No newline at end of file From cd0753bd2d387da73d2a7504fe2c4a070b9c2134 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Mon, 29 Oct 2018 20:18:44 +1100 Subject: [PATCH 110/228] * Ability to assign a customer to a dedicated support staff member * Ability to assign a customer to a dedicated support staff member --- website_support/__manifest__.py | 2 +- website_support/doc/changelog.rst | 4 ++++ website_support/models/res_partner.py | 1 + website_support/models/website_support_ticket.py | 4 ++++ website_support/views/res_partner_views.xml | 1 + 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/website_support/__manifest__.py b/website_support/__manifest__.py index 6eb6f59a7..c0eff8292 100644 --- a/website_support/__manifest__.py +++ b/website_support/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Website Help Desk / Support Ticket", - 'version': "1.3.10", + 'version': "1.3.11", 'author': "Sythil Tech, Adaptive City", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/website_support/doc/changelog.rst b/website_support/doc/changelog.rst index 5bda0fbf2..a74415c16 100644 --- a/website_support/doc/changelog.rst +++ b/website_support/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.3.11 +======= +* Ability to assign a customer to a dedicated support staff member + v1.3.10 ======= * Help page unpublish / republish diff --git a/website_support/models/res_partner.py b/website_support/models/res_partner.py index ca20148de..7937ed27f 100644 --- a/website_support/models/res_partner.py +++ b/website_support/models/res_partner.py @@ -11,6 +11,7 @@ class ResPartnerTicket(models.Model): support_ticket_string = fields.Char(compute="_compute_support_ticket_string", string="Support Ticket String") stp_ids = fields.Many2many('res.partner', 'stp_res_partner_rel', 'stp_p1_id', 'stp_p2_id', string="Support Ticket Access Accounts", help="Can view support tickets from other contacts") sla_id = fields.Many2one('website.support.sla', string="SLA") + dedicated_support_user_id = fields.Many2one('res.users', string="Dedicated Support User") @api.one @api.depends('support_ticket_ids') diff --git a/website_support/models/website_support_ticket.py b/website_support/models/website_support_ticket.py index 54d599354..9a7623a62 100644 --- a/website_support/models/website_support_ticket.py +++ b/website_support/models/website_support_ticket.py @@ -329,6 +329,10 @@ def create(self, vals): ticket_open_email_template = self.env['ir.model.data'].get_object('website_support', 'website_ticket_state_open').mail_template_id ticket_open_email_template.send_mail(new_id.id, True) + #If the customer has a dedicated support user then automatically assign them + if new_id.partner_id.dedicated_support_user_id: + new_id.user_id = new_id.partner_id.dedicated_support_user_id.id + #Check if this contact has a SLA assigned if new_id.partner_id.sla_id: #Check if this category has a SLA response time diff --git a/website_support/views/res_partner_views.xml b/website_support/views/res_partner_views.xml index 4f813e2ec..b6ebdcf01 100644 --- a/website_support/views/res_partner_views.xml +++ b/website_support/views/res_partner_views.xml @@ -18,6 +18,7 @@ + From cfd5b59869c66c6e08588d06ebe7bad309ab0dee Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Tue, 30 Oct 2018 14:35:54 +1100 Subject: [PATCH 111/228] custom store module udpate custom store module udpate --- app_store/__manifest__.py | 2 +- app_store/controllers/main.py | 9 +++--- app_store/doc/changelog.rst | 4 +++ app_store/models/appstore_account.py | 13 ++++---- app_store_client/__manifest__.py | 2 +- app_store_client/controllers/main.py | 4 +-- app_store_client/doc/changelog.rst | 4 +++ .../models/module_custom_updates.py | 30 +++++++++++++++++-- .../views/module_custom_updates_views.xml | 2 +- 9 files changed, 51 insertions(+), 19 deletions(-) diff --git a/app_store/__manifest__.py b/app_store/__manifest__.py index b4b2b76f7..690a79650 100644 --- a/app_store/__manifest__.py +++ b/app_store/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Custom App Store", - 'version': "1.0.1", + 'version': "1.0.2", 'author': "Sythil Tech", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/app_store/controllers/main.py b/app_store/controllers/main.py index 85cc98f0e..c2cfc92cf 100644 --- a/app_store/controllers/main.py +++ b/app_store/controllers/main.py @@ -43,10 +43,11 @@ def browse_apps(self, **kwargs): modules = request.env['module.overview'].search([]) return http.request.render('app_store.app_list', {'modules':modules}) - @http.route('/apps/modules/download/', type="http", auth="public", website=True) + @http.route('/apps/modules/download/', type="http", auth="public") def app_download(self, module_name, **kwargs): """Download the module zip""" - filename = str(module_name) + ".zip" + + filename = module_name + ".zip" headers = [ ('Content-Type', 'application/octet-stream; charset=binary'), ('Content-Disposition', "attachment; filename=" + filename ), @@ -58,7 +59,7 @@ def app_download(self, module_name, **kwargs): home_directory = os.path.expanduser('~') app_directory = home_directory + "/apps" - response = werkzeug.wrappers.Response(file(app_directory + "/" + module_name + ".zip"), headers=headers, direct_passthrough=True) + response = werkzeug.wrappers.Response(open(app_directory + "/" + module_name + ".zip", mode="r+b"), headers=headers, direct_passthrough=True) return response def content_disposition(self, filename): @@ -127,6 +128,6 @@ def app_page_client(self, module_name, **kwargs): def custom_app_store_updates(self, **kwargs): module_list = [] for md in request.env['module.overview'].search([]): - module_list.append({'name': md.name, 'latest_version': "11." + md.version}) + module_list.append({'name': md.name, 'latest_version': "11.0." + md.version}) return json.dumps(module_list) \ No newline at end of file diff --git a/app_store/doc/changelog.rst b/app_store/doc/changelog.rst index 60d35e74c..27b12b236 100644 --- a/app_store/doc/changelog.rst +++ b/app_store/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.0.2 +====== +* Module update support and github sync fix + v1.0.1 ====== * Fix module analyse issue diff --git a/app_store/models/appstore_account.py b/app_store/models/appstore_account.py index 92daefbd0..7865517e1 100644 --- a/app_store/models/appstore_account.py +++ b/app_store/models/appstore_account.py @@ -31,8 +31,6 @@ class AppstoreAccountRepository(models.Model): @api.model def check_all_repositories(self): """Checks to see if there are any new modules""" - #https://github.com/SythilTech/Odoo#9.0 - #https://github.com/SythilTech/Odoo/archive/9.0.zip filename = tempfile.mktemp('.zip') destDir = tempfile.mktemp() @@ -50,19 +48,18 @@ def check_all_repositories(self): repo_data = urlopen(q).read() - #thefile = zipfile.ZipFile(BytesIO(repo_data)) + thefile = zipfile.ZipFile(BytesIO(repo_data)) - #if not os.path.exists(rep_directory): - # os.makedirs(rep_directory) + if not os.path.exists(rep_directory): + os.makedirs(rep_directory) - #thefile.extractall(rep_directory) + thefile.extractall(rep_directory) - #thefile.close() + thefile.close() rep_name = account_repository.url.split("/")[4].replace("#","-") full_rep_path = rep_directory + "/" + rep_name - _logger.error(full_rep_path) #Go through all module folders under the repository directory and analyse the module for dir in os.listdir(full_rep_path): diff --git a/app_store_client/__manifest__.py b/app_store_client/__manifest__.py index 1a8fd8383..e85a939f0 100644 --- a/app_store_client/__manifest__.py +++ b/app_store_client/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Custom App Store Client", - 'version': "1.0.1", + 'version': "1.0.2", 'author': "Sythil Tech", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/app_store_client/controllers/main.py b/app_store_client/controllers/main.py index 73767db58..610ddc9e7 100644 --- a/app_store_client/controllers/main.py +++ b/app_store_client/controllers/main.py @@ -25,14 +25,14 @@ def app_store_download(self, **kw): home_directory = os.path.expanduser('~') mod_name = values['module_name'] - app_directory = home_directory + "/.local/share/Odoo/addons/9.0/" + mod_name + ".zip" + app_directory = home_directory + "/.local/share/Odoo/addons/11.0/" + mod_name + ".zip" #Save zip to addons folder with open(app_directory, 'wb') as handle: for block in module_file.iter_content(1024): handle.write(block) - module_path = home_directory + "/.local/share/Odoo/addons/9.0/" + mod_name + module_path = home_directory + "/.local/share/Odoo/addons/11.0/" + mod_name zip_ref = zipfile.ZipFile(app_directory, 'r') zip_ref.extractall(module_path) zip_ref.close() diff --git a/app_store_client/doc/changelog.rst b/app_store_client/doc/changelog.rst index 7215a2162..163d47ccb 100644 --- a/app_store_client/doc/changelog.rst +++ b/app_store_client/doc/changelog.rst @@ -1,3 +1,7 @@ +v1.0.2 +====== +* Click button to automatically transfer latest version into addons folder (-> manual Odoo restart required <-) + v1.0.1 ====== * Display list of new versions diff --git a/app_store_client/models/module_custom_updates.py b/app_store_client/models/module_custom_updates.py index 4db09429b..e69819f8b 100644 --- a/app_store_client/models/module_custom_updates.py +++ b/app_store_client/models/module_custom_updates.py @@ -3,8 +3,12 @@ _logger = logging.getLogger(__name__) import json import requests +import os +import zipfile +import urllib.request +import io -from openerp import api, fields, models +from odoo import api, fields, models, modules class ModuleCustomUpdates(models.Model): @@ -16,10 +20,32 @@ class ModuleCustomUpdates(models.Model): latest_version = fields.Char(string="Lastest Version") changelog = fields.Text(string="Changelog") - + @api.multi def custom_module_update_download(self): + self.ensure_one() _logger.error("Update Module") + module_path = modules.get_module_path(self.name) + + app_store = self.env['ir.config_parameter'].get_param('custom_app_store_url') + r = requests.get(app_store + "/apps/modules/download/" + self.name) + + zip_ref = zipfile.ZipFile(io.BytesIO(r.content)) + zip_ref.extractall(module_path) + zip_ref.close() + + updated_module = self.env['ir.module.module'].search([('name','=',self.name)])[0] + #updated_module.button_immediate_install() + + return { + 'name': 'Module', + 'view_mode': 'form', + 'view_type': 'kanban,tree,form', + 'res_model': 'ir.module.module', + 'res_id': updated_module.id, + 'type': 'ir.actions.act_window', + } + @api.multi def check_custom_app_store_updates(self): self.ensure_one() diff --git a/app_store_client/views/module_custom_updates_views.xml b/app_store_client/views/module_custom_updates_views.xml index 312f1cfb9..32bd35dc8 100644 --- a/app_store_client/views/module_custom_updates_views.xml +++ b/app_store_client/views/module_custom_updates_views.xml @@ -27,7 +27,7 @@ Internal Name:
    Installed Version:
    Latest Version:
    - +
    From 096fb90e077089362e00580393513a883053ddc1 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Tue, 30 Oct 2018 17:33:13 +1100 Subject: [PATCH 112/228] v1.3.12 v1.3.12 ======= * Department manager access to department contact tickets fix * Automatically add category follower to ticket followers --- website_support/__manifest__.py | 2 +- website_support/controllers/main.py | 31 +++++++++++++------ website_support/doc/changelog.rst | 5 +++ .../models/website_support_ticket.py | 3 ++ 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/website_support/__manifest__.py b/website_support/__manifest__.py index c0eff8292..8ca329970 100644 --- a/website_support/__manifest__.py +++ b/website_support/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Website Help Desk / Support Ticket", - 'version': "1.3.11", + 'version': "1.3.12", 'author': "Sythil Tech, Adaptive City", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/website_support/controllers/main.py b/website_support/controllers/main.py index b0fcda987..2ff692ee2 100644 --- a/website_support/controllers/main.py +++ b/website_support/controllers/main.py @@ -422,22 +422,35 @@ def support_ticket_view_list(self, **kw): values = {} for field_name, field_value in kw.items(): values[field_name] = field_value - - extra_access = [] + + #Determine which tickets the logged in user can see + ticket_access = [] + + #Can see own tickets + ticket_access.append(http.request.env.user.partner_id.id) + + #Can see tickets of any contacts under the logged in users additional access field (TODO remove this as departments is the evolved version of this feature) for extra_permission in http.request.env.user.partner_id.stp_ids: - extra_access.append(extra_permission.id) + ticket_access.append(extra_permission.id) + + #If the logged in user is a department manager then add all the contacts in the department to the access list + for dep in request.env['website.support.department.contact'].sudo().search([('user_id','=',http.request.env.user.id)]): + for contact in dep.wsd_id.partner_ids: + ticket_access.append(contact.id) + search_t = [('partner_id', 'in', ticket_access), ('partner_id','!=',False)] + if 'state' in values: - support_tickets = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False), ('state', '=', int(values['state'])) ]) - else: - support_tickets = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False) ]) + search_t.append(('state', '=', int(values['state']))) + + support_tickets = request.env['website.support.ticket'].sudo().search(search_t) no_approval_required = request.env['ir.model.data'].get_object('website_support','no_approval_required') - change_requests = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False), ('approval_id','!=',no_approval_required.id) ], order="planned_time desc") + change_requests = request.env['website.support.ticket'].sudo().search([('partner_id', 'in', ticket_access), ('partner_id','!=',False), ('approval_id','!=',no_approval_required.id) ], order="planned_time desc") - ticket_states = http.request.env['website.support.ticket.states'].sudo().search([]) + ticket_states = request.env['website.support.ticket.states'].sudo().search([]) - return http.request.render('website_support.support_ticket_view_list', {'support_tickets':support_tickets,'ticket_count':len(support_tickets), 'change_requests': change_requests, 'request_count': len(change_requests), 'ticket_states': ticket_states}) + return request.render('website_support.support_ticket_view_list', {'support_tickets':support_tickets,'ticket_count':len(support_tickets), 'change_requests': change_requests, 'request_count': len(change_requests), 'ticket_states': ticket_states}) @http.route('/support/ticket/view/', type="http", auth="user", website=True) def support_ticket_view(self, ticket): diff --git a/website_support/doc/changelog.rst b/website_support/doc/changelog.rst index a74415c16..9c4583e86 100644 --- a/website_support/doc/changelog.rst +++ b/website_support/doc/changelog.rst @@ -1,3 +1,8 @@ +v1.3.12 +======= +* Department manager access to department contact tickets fix +* Automatically add category follower to ticket followers + v1.3.11 ======= * Ability to assign a customer to a dedicated support staff member diff --git a/website_support/models/website_support_ticket.py b/website_support/models/website_support_ticket.py index 9a7623a62..4a523cba2 100644 --- a/website_support/models/website_support_ticket.py +++ b/website_support/models/website_support_ticket.py @@ -348,6 +348,9 @@ def create(self, vals): support_ticket_menu = self.env['ir.model.data'].sudo().get_object('website_support', 'website_support_ticket_menu') support_ticket_action = self.env['ir.model.data'].sudo().get_object('website_support', 'website_support_ticket_action') + #Add them as a follower to the ticket so they are aware of any internal notes + new_id.message_subscribe_users(user_ids=new_id.category.cat_user_ids.ids) + for my_user in new_id.category.cat_user_ids: values = notification_template.generate_email(new_id.id) values['body_html'] = values['body_html'].replace("_ticket_url_", "web#id=" + str(new_id.id) + "&view_type=form&model=website.support.ticket&menu_id=" + str(support_ticket_menu.id) + "&action=" + str(support_ticket_action.id) ).replace("_user_name_", my_user.partner_id.name) From 940a40bce207b79e7d6ff28f3870307bdc5b02a8 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Tue, 30 Oct 2018 18:41:46 +1100 Subject: [PATCH 113/228] v1.0.3 v1.0.3 ====== * Fix to not analyse modules with no version number * Fix for modules whose version number already starts with 11.0 * Fix for github repo zips not being in root ~/apps directory which update mechanism expects --- app_store/__manifest__.py | 2 +- app_store/controllers/main.py | 6 +++++- app_store/doc/changelog.rst | 6 ++++++ app_store/models/module_overview.py | 6 +++++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app_store/__manifest__.py b/app_store/__manifest__.py index 690a79650..a85e62840 100644 --- a/app_store/__manifest__.py +++ b/app_store/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Custom App Store", - 'version': "1.0.2", + 'version': "1.0.3", 'author': "Sythil Tech", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/app_store/controllers/main.py b/app_store/controllers/main.py index c2cfc92cf..d5fa37b54 100644 --- a/app_store/controllers/main.py +++ b/app_store/controllers/main.py @@ -128,6 +128,10 @@ def app_page_client(self, module_name, **kwargs): def custom_app_store_updates(self, **kwargs): module_list = [] for md in request.env['module.overview'].search([]): - module_list.append({'name': md.name, 'latest_version': "11.0." + md.version}) + if md.version.startswith("11.0"): + module_list.append({'name': md.name, 'latest_version': "11.0." + md.version}) + else: + #Prefix with 11.0 so we can compare against the installed version + module_list.append({'name': md.name, 'latest_version': "11.0." + md.version}) return json.dumps(module_list) \ No newline at end of file diff --git a/app_store/doc/changelog.rst b/app_store/doc/changelog.rst index 27b12b236..9e5c3ed82 100644 --- a/app_store/doc/changelog.rst +++ b/app_store/doc/changelog.rst @@ -1,3 +1,9 @@ +v1.0.3 +====== +* Fix to not analyse modules with no version number +* Fix for modules whose version number already starts with 11.0 +* Fix for github repo zips not being in root ~/apps directory which update mechanism expects + v1.0.2 ====== * Module update support and github sync fix diff --git a/app_store/models/module_overview.py b/app_store/models/module_overview.py index e964e7995..3f8118b20 100644 --- a/app_store/models/module_overview.py +++ b/app_store/models/module_overview.py @@ -130,6 +130,10 @@ def analyse_module(self, module_name, app_directory): op_settings = ast.literal_eval(trimmed_data) + #Modules that don't have version number are not analysed + if 'version' not in op_settings: + return 0 + #Convert icon file to base64 icon_base64 = "" if os.path.isfile(app_directory + "/" + module_name + "/static/description/icon.png"): @@ -184,7 +188,7 @@ def analyse_module(self, module_name, app_directory): # self._read_csv(filename, open( os.path.join(root, filename) ).read(), module_overview.id) #Create a zip of the module (TODO include dependacies) - zf = zipfile.ZipFile(app_directory + "/" + module_name + ".zip", "w") + zf = zipfile.ZipFile(os.path.expanduser('~') + "/apps/" + module_name + ".zip", "w") for dirname, subdirs, files in os.walk(app_directory + "/" + module_name): for filename in files: full_file_path = os.path.join(dirname, filename) From 93adc0b2d331331d9a8af8e87a4c3212cc9e7ec2 Mon Sep 17 00:00:00 2001 From: Steven Wright Date: Wed, 31 Oct 2018 11:37:23 +1100 Subject: [PATCH 114/228] v1.0.4 v1.0.4 ====== * Fix analyse issue * Addd author field * Revamp user interface of client app store * Fix latest version number display in custom apps update --- app_store/__manifest__.py | 2 +- app_store/controllers/main.py | 4 +- app_store/doc/changelog.rst | 7 ++++ app_store/models/module_overview.py | 24 +++++++----- app_store/views/module_overview_templates.xml | 37 +++++++++++-------- app_store/views/module_overview_views.xml | 1 + 6 files changed, 47 insertions(+), 28 deletions(-) diff --git a/app_store/__manifest__.py b/app_store/__manifest__.py index a85e62840..c47b752e6 100644 --- a/app_store/__manifest__.py +++ b/app_store/__manifest__.py @@ -1,6 +1,6 @@ { 'name': "Custom App Store", - 'version': "1.0.3", + 'version': "1.0.4", 'author': "Sythil Tech", 'category': "Tools", 'support': "steven@sythiltech.com.au", diff --git a/app_store/controllers/main.py b/app_store/controllers/main.py index d5fa37b54..d0d4202ca 100644 --- a/app_store/controllers/main.py +++ b/app_store/controllers/main.py @@ -128,8 +128,8 @@ def app_page_client(self, module_name, **kwargs): def custom_app_store_updates(self, **kwargs): module_list = [] for md in request.env['module.overview'].search([]): - if md.version.startswith("11.0"): - module_list.append({'name': md.name, 'latest_version': "11.0." + md.version}) + if md.version.startswith("11.0."): + module_list.append({'name': md.name, 'latest_version': md.version}) else: #Prefix with 11.0 so we can compare against the installed version module_list.append({'name': md.name, 'latest_version': "11.0." + md.version}) diff --git a/app_store/doc/changelog.rst b/app_store/doc/changelog.rst index 9e5c3ed82..c86509aba 100644 --- a/app_store/doc/changelog.rst +++ b/app_store/doc/changelog.rst @@ -1,3 +1,10 @@ +v1.0.4 +====== +* Fix analyse issue +* Addd author field +* Revamp user interface of client app store +* Fix latest version number display in custom apps update + v1.0.3 ====== * Fix to not analyse modules with no version number diff --git a/app_store/models/module_overview.py b/app_store/models/module_overview.py index 3f8118b20..0d4cbca3a 100644 --- a/app_store/models/module_overview.py +++ b/app_store/models/module_overview.py @@ -36,6 +36,7 @@ class ModuleOverview(models.Model): module_download_count = fields.Integer(string="Module Download Count", help="The amount of times this module has been downloaded") module_name = fields.Char(string="Module Name") version = fields.Char(string="Version Number") + author = fields.Char(string="Author") icon = fields.Binary(string="Icon") store_description = fields.Html(string="Store Description") change_log_raw = fields.Text(string="Change Log") @@ -126,7 +127,7 @@ def analyse_module(self, module_name, app_directory): if not line.lstrip().startswith("#"): trimmed_data += line - trimmed_data = trimmed_data.replace("'", "\"") + #trimmed_data = trimmed_data.replace("'", "\"") op_settings = ast.literal_eval(trimmed_data) @@ -151,6 +152,9 @@ def analyse_module(self, module_name, app_directory): module_overview.image_ids.unlink() module_overview.depend_ids.unlink() + if 'author' in op_settings: + module_overview.author = op_settings['author'] + module_overview.module_name = op_settings['name'] module_overview.icon = icon_base64 module_overview.version = op_settings['version'] @@ -169,16 +173,18 @@ def analyse_module(self, module_name, app_directory): descriptiondata = descriptionfile.read() module_overview.store_description = descriptiondata - for depend in op_settings['depends']: - self.env['module.overview.depend'].create({'mo_id': module_overview.id, 'name': depend}) + if 'depends' in op_settings: + for depend in op_settings['depends']: + self.env['module.overview.depend'].create({'mo_id': module_overview.id, 'name': depend}) - for img in op_settings['images']: - image_path = app_directory + "/" + module_name + "/" + img - if os.path.exists(image_path): - with open(image_path, "rb") as screenshot_file: - screenshot_base64 = base64.b64encode(screenshot_file.read()) + if 'images' in op_settings: + for img in op_settings['images']: + image_path = app_directory + "/" + module_name + "/" + img + if os.path.exists(image_path): + with open(image_path, "rb") as screenshot_file: + screenshot_base64 = base64.b64encode(screenshot_file.read()) - self.env['module.overview.image'].create({'mo_id': module_overview.id, 'name': img, 'file_data': screenshot_base64}) + self.env['module.overview.image'].create({'mo_id': module_overview.id, 'name': img, 'file_data': screenshot_base64}) for root, dirnames, filenames in os.walk(app_directory + '/' + module_name): for filename in fnmatch.filter(filenames, '*.xml'): diff --git a/app_store/views/module_overview_templates.xml b/app_store/views/module_overview_templates.xml index 721aab831..0ded3dcef 100644 --- a/app_store/views/module_overview_templates.xml +++ b/app_store/views/module_overview_templates.xml @@ -11,14 +11,17 @@ - - - +
    + +
    +
    +
    + + +
    +
    +
    +