Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package galene for openSUSE:Factory checked 
in at 2021-04-27 21:35:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/galene (Old)
 and      /work/SRC/openSUSE:Factory/.galene.new.12324 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "galene"

Tue Apr 27 21:35:29 2021 rev:8 rq:888869 version:0.3.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/galene/galene.changes    2021-04-17 
23:24:51.213582642 +0200
+++ /work/SRC/openSUSE:Factory/.galene.new.12324/galene.changes 2021-04-27 
21:36:02.592120185 +0200
@@ -1,0 +2,10 @@
+Tue Apr 27 17:22:43 UTC 2021 - [email protected]
+
+- Update to version 0.3.4:
+  * Fixed a bug in the loss estimator.  We will now reduce the rate more
+    aggressively when there is loss in the client->serer direction.
+  * Fixed display of the chat on some devices.
+  * Exported the group.Description data structure for the sake of external
+    configuration tools.
+
+-------------------------------------------------------------------

Old:
----
  galene-0.3.3.tar.gz

New:
----
  galene-0.3.4.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ galene.spec ++++++
--- /var/tmp/diff_new_pack.RbtqSq/_old  2021-04-27 21:36:03.204121192 +0200
+++ /var/tmp/diff_new_pack.RbtqSq/_new  2021-04-27 21:36:03.204121192 +0200
@@ -25,7 +25,7 @@
 %bcond_without  apparmor
 
 Name:           galene
-Version:        0.3.3
+Version:        0.3.4
 Release:        0
 Summary:        Gal??ne videoconferencing server
 License:        MIT

++++++ _service ++++++
--- /var/tmp/diff_new_pack.RbtqSq/_old  2021-04-27 21:36:03.232121238 +0200
+++ /var/tmp/diff_new_pack.RbtqSq/_new  2021-04-27 21:36:03.232121238 +0200
@@ -3,8 +3,8 @@
     <param name="url">git://github.com/jech/galene.git</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">galene-0.3.3</param>
-    <param name="version">0.3.3</param>
+    <param name="revision">galene-0.3.4</param>
+    <param name="version">0.3.4</param>
     <param name="changesgenerate">enable</param>
     <!--param name="versionrewrite-pattern">galene-(\d+)</param>
     <param name="versionrewrite-replacement">\1</param-->

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.RbtqSq/_old  2021-04-27 21:36:03.248121265 +0200
+++ /var/tmp/diff_new_pack.RbtqSq/_new  2021-04-27 21:36:03.248121265 +0200
@@ -1,4 +1,4 @@
 <servicedata>
 <service name="tar_scm">
                 <param name="url">git://github.com/jech/galene.git</param>
-              <param 
name="changesrevision">45558f3e881543b0394e70069f2307434b9f6580</param></service></servicedata>
\ No newline at end of file
+              <param 
name="changesrevision">cd673d01d34b09fe68450ad57d406ccf6903a0d3</param></service></servicedata>
\ No newline at end of file

++++++ galene-0.3.3.tar.gz -> galene-0.3.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/CHANGES new/galene-0.3.4/CHANGES
--- old/galene-0.3.3/CHANGES    2021-04-16 22:31:25.000000000 +0200
+++ new/galene-0.3.4/CHANGES    2021-04-27 16:15:33.000000000 +0200
@@ -1,3 +1,11 @@
+27 April 2021: Gal??ne 0.3.4
+
+  * Fixed a bug in the loss estimator.  We will now reduce the rate more
+    aggressively when there is loss in the client->serer direction.
+  * Fixed display of the chat on some devices.
+  * Exported the group.Description data structure for the sake of external
+    configuration tools.
+
 16 April 2021: Gal??ne 0.3.3
 
   * Fixed an off-by-one error that could occasionally lead to a server
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/go.mod new/galene-0.3.4/go.mod
--- old/galene-0.3.3/go.mod     2021-04-16 22:31:25.000000000 +0200
+++ new/galene-0.3.4/go.mod     2021-04-27 16:15:33.000000000 +0200
@@ -3,13 +3,13 @@
 go 1.13
 
 require (
-       github.com/at-wat/ebml-go v0.15.0
+       github.com/at-wat/ebml-go v0.16.0
        github.com/gorilla/websocket v1.4.2
-       github.com/pion/ice/v2 v2.0.15
+       github.com/pion/ice/v2 v2.1.5
        github.com/pion/rtcp v1.2.6
        github.com/pion/rtp v1.6.2
        github.com/pion/sdp/v3 v3.0.4
        github.com/pion/turn/v2 v2.0.5
-       github.com/pion/webrtc/v3 v3.0.12
-       golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83
+       github.com/pion/webrtc/v3 v3.0.25
+       golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/go.sum new/galene-0.3.4/go.sum
--- old/galene-0.3.3/go.sum     2021-04-16 22:31:25.000000000 +0200
+++ new/galene-0.3.4/go.sum     2021-04-27 16:15:33.000000000 +0200
@@ -1,59 +1,52 @@
-github.com/at-wat/ebml-go v0.15.0 
h1:TkKXDOyT720o0pc8rENLknicSILxS1izaII/zaPLTEQ=
-github.com/at-wat/ebml-go v0.15.0/go.mod 
h1:w1cJs7zmGsb5nnSvhWGKLCxvfu4FVx5ERvYDIalj1ww=
+github.com/at-wat/ebml-go v0.16.0 
h1:3NPy83uMzVRHWdWlcJYSXWn/+u2GmtPQSL1LZJbjcCw=
+github.com/at-wat/ebml-go v0.16.0/go.mod 
h1:w1cJs7zmGsb5nnSvhWGKLCxvfu4FVx5ERvYDIalj1ww=
 github.com/davecgh/go-spew v1.1.0/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 
h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/fsnotify/fsnotify v1.4.7 
h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 github.com/fsnotify/fsnotify v1.4.7/go.mod 
h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9 
h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod 
h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/golang/protobuf v1.2.0 
h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod 
h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
 github.com/golang/protobuf v1.2.0/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.4.0-rc.1/go.mod 
h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod 
h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 github.com/golang/protobuf v1.4.0-rc.2/go.mod 
h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod 
h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 github.com/golang/protobuf v1.4.0/go.mod 
h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.2 
h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
 github.com/golang/protobuf v1.4.2/go.mod 
h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod 
h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/google/go-cmp v0.3.0/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
 github.com/google/go-cmp v0.4.0/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/uuid v1.1.5 h1:kxhtnfFVi+rYdOALN0B3k9UT86zVJKfBimRaciULW4I=
-github.com/google/uuid v1.1.5/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
+github.com/google/uuid v1.2.0/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gorilla/websocket v1.4.2 
h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
 github.com/gorilla/websocket v1.4.2/go.mod 
h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod 
h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod 
h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod 
h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
 github.com/nxadm/tail v1.4.4/go.mod 
h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8/go.mod 
h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 github.com/onsi/ginkgo v1.6.0/go.mod 
h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.1/go.mod 
h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.14.2/go.mod 
h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
+github.com/onsi/ginkgo v1.16.1/go.mod 
h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
 github.com/onsi/gomega v1.7.1/go.mod 
h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
 github.com/onsi/gomega v1.10.1/go.mod 
h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.10.3/go.mod 
h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
+github.com/onsi/gomega v1.11.0/go.mod 
h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
 github.com/pion/datachannel v1.4.21 
h1:3ZvhNyfmxsAqltQrApLPQMhSFNA+aT87RqyCq4OXmf0=
 github.com/pion/datachannel v1.4.21/go.mod 
h1:oiNyP4gHx2DIwRzX/MFyH0Rz/Gz05OgBlayAI2hAWjg=
-github.com/pion/dtls/v2 v2.0.4 h1:WuUcqi6oYMu/noNTz92QrF1DaFj4eXbhQ6dzaaAwOiI=
-github.com/pion/dtls/v2 v2.0.4/go.mod 
h1:qAkFscX0ZHoI1E07RfYPoRw3manThveu+mlTDdOxoGI=
-github.com/pion/dtls/v2 v2.0.7 h1:PNcUs/G1l9hb4jzMEorgFMxIBdp7fRN4LIApOTMtCYs=
-github.com/pion/dtls/v2 v2.0.7/go.mod 
h1:QuDII+8FVvk9Dp5t5vYIMTo7hh7uBkra+8QIm7QGm10=
-github.com/pion/ice/v2 v2.0.15 h1:KZrwa2ciL9od8+TUVJiYTNsCW9J5lktBjGwW1MacEnQ=
-github.com/pion/ice/v2 v2.0.15/go.mod 
h1:ZIiVGevpgAxF/cXiIVmuIUtCb3Xs4gCzCbXB6+nFkSI=
-github.com/pion/interceptor v0.0.10 
h1:dXFyFWRJFwmzQqyn0U8dUAbOJu+JJnMVAqxmvTu30B4=
-github.com/pion/interceptor v0.0.10/go.mod 
h1:qzeuWuD/ZXvPqOnxNcnhWfkCZ2e1kwwslicyyPnhoK4=
+github.com/pion/dtls/v2 v2.0.9 h1:7Ow+V++YSZQMYzggI0P9vLJz/hUFcffsfGMfT/Qy+u8=
+github.com/pion/dtls/v2 v2.0.9/go.mod 
h1:O0Wr7si/Zj5/EBFlDzDd6UtVxx25CE1r7XM7BQKYQho=
+github.com/pion/ice/v2 v2.1.5 h1:OqWkKmiLqDU6j+oZnoaxTtO2tR/2QwrUfj3l7BgltzE=
+github.com/pion/ice/v2 v2.1.5/go.mod 
h1:kV4EODVD5ux2z8XncbLHIOtcXKtYXVgLVCeVqnpoeP0=
+github.com/pion/interceptor v0.0.12 
h1:eC1iVneBIAQJEfaNAfDqAncJWhMDAnaXPRCJsltdokE=
+github.com/pion/interceptor v0.0.12/go.mod 
h1:qzeuWuD/ZXvPqOnxNcnhWfkCZ2e1kwwslicyyPnhoK4=
 github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
 github.com/pion/logging v0.2.2/go.mod 
h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
-github.com/pion/mdns v0.0.4 h1:O4vvVqr4DGX63vzmO6Fw9vpy3lfztVWHGCQfyw0ZLSY=
-github.com/pion/mdns v0.0.4/go.mod 
h1:R1sL0p50l42S5lJs91oNdUL58nm0QHrhxnSegr++qC0=
+github.com/pion/mdns v0.0.5 h1:Q2oj/JB3NqfzY9xGZ1fPzZzK7sDSD8rZPOvcIQ10BCw=
+github.com/pion/mdns v0.0.5/go.mod 
h1:UgssrvdD3mxpi8tMxAXbsppL3vJ4Jipw1mTCW+al01g=
 github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
 github.com/pion/randutil v0.1.0/go.mod 
h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
 github.com/pion/rtcp v1.2.6 h1:1zvwBbyd0TeEuuWftrd/4d++m+/kZSeiguxU61LFWpo=
@@ -61,92 +54,80 @@
 github.com/pion/rtp v1.6.2 h1:iGBerLX6JiDjB9NXuaPzHyxHFG9JsIEdgwTC0lp5n/U=
 github.com/pion/rtp v1.6.2/go.mod 
h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
 github.com/pion/sctp v1.7.10/go.mod 
h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0=
-github.com/pion/sctp v1.7.11 h1:UCnj7MsobLKLuP/Hh+JMiI/6W5Bs/VF45lWKgHFjSIE=
-github.com/pion/sctp v1.7.11/go.mod 
h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0=
+github.com/pion/sctp v1.7.12 h1:GsatLufywVruXbZZT1CKg+Jr8ZTkwiPnmUC/oO9+uuY=
+github.com/pion/sctp v1.7.12/go.mod 
h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s=
 github.com/pion/sdp/v3 v3.0.4 h1:2Kf+dgrzJflNCSw3TV5v2VLeI0s/qkzy2r5jlR0wzf8=
 github.com/pion/sdp/v3 v3.0.4/go.mod 
h1:bNiSknmJE0HYBprTHXKPQ3+JjacTv5uap92ueJZKsRk=
-github.com/pion/srtp/v2 v2.0.1 h1:kgfh65ob3EcnFYA4kUBvU/menCp9u7qaJLXwWgpobzs=
-github.com/pion/srtp/v2 v2.0.1/go.mod 
h1:c8NWHhhkFf/drmHTAblkdu8++lsISEBBdAuiyxgqIsE=
+github.com/pion/srtp/v2 v2.0.2 h1:664iGzVmaY7KYS5M0gleY0DscRo9ReDfTxQrq4UgGoU=
+github.com/pion/srtp/v2 v2.0.2/go.mod 
h1:VEyLv4CuxrwGY8cxM+Ng3bmVy8ckz/1t6A0q/msKOw0=
 github.com/pion/stun v0.3.5 h1:uLUCBCkQby4S1cf6CGuR9QrVOKcvUwFeemaC865QHDg=
 github.com/pion/stun v0.3.5/go.mod 
h1:gDMim+47EeEtfWogA37n6qXZS88L5V6LqFcf+DZA2UA=
-github.com/pion/transport v0.8.10/go.mod 
h1:tBmha/UCjpum5hqTWhfAEs3CO4/tHSg0MYRhSzR+CZ8=
-github.com/pion/transport v0.10.0 
h1:9M12BSneJm6ggGhJyWpDveFOstJsTiQjkLf4M44rm80=
-github.com/pion/transport v0.10.0/go.mod 
h1:BnHnUipd0rZQyTVB2SBGojFHT9CBt5C5TcsJSQGkvSE=
-github.com/pion/transport v0.10.1 
h1:2W+yJT+0mOQ160ThZYUx5Zp2skzshiNgxrNE9GUfhJM=
 github.com/pion/transport v0.10.1/go.mod 
h1:PBis1stIILMiis0PewDw91WJeLJkyIMcEk+DwKOzf4A=
-github.com/pion/transport v0.12.1/go.mod 
h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q=
-github.com/pion/transport v0.12.2 
h1:WYEjhloRHt1R86LhUKjC5y+P52Y11/QqEUalvtzVoys=
 github.com/pion/transport v0.12.2/go.mod 
h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q=
+github.com/pion/transport v0.12.3 
h1:vdBfvfU/0Wq8kd2yhUMSDB/x+O4Z9MYVl2fJ5BT4JZw=
+github.com/pion/transport v0.12.3/go.mod 
h1:OViWW9SP2peE/HbwBvARicmAVnesphkNkCVZIWJ6q9A=
 github.com/pion/turn/v2 v2.0.5 h1:iwMHqDfPEDEOFzwWKT56eFmh6DYC6o/+xnLAEzgISbA=
 github.com/pion/turn/v2 v2.0.5/go.mod 
h1:APg43CFyt/14Uy7heYUOGWdkem/Wu4PhCO/bjyrTqMw=
-github.com/pion/udp v0.1.0 h1:uGxQsNyrqG3GLINv36Ff60covYmfrLoxzwnCsIYspXI=
-github.com/pion/udp v0.1.0/go.mod 
h1:BPELIjbwE9PRbd/zxI/KYBnbo7B6+oA6YuEaNE8lths=
-github.com/pion/webrtc/v3 v3.0.12 
h1:XjTwtnx8dsyfBfESHAdBTnqmajku+2Y9RXXyC4KB0LM=
-github.com/pion/webrtc/v3 v3.0.12/go.mod 
h1:Y9t8I+0qeCCaUjg5wrweNVtK7reqZHc/MQdkznhzcro=
+github.com/pion/udp v0.1.1 h1:8UAPvyqmsxK8oOjloDk4wUt63TzFe9WEJkg5lChlj7o=
+github.com/pion/udp v0.1.1/go.mod 
h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M=
+github.com/pion/webrtc/v3 v3.0.25 
h1:AOsku4YIegyrGD6CQFDDGvNeS1p8KnwWlnDWaY3yTTM=
+github.com/pion/webrtc/v3 v3.0.25/go.mod 
h1:Qx9zd4xvIeFTN1hygyJ77XVi/YbElyjVitL6KyCEIpE=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 
h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod 
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/sclevine/agouti v3.0.0+incompatible/go.mod 
h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
 github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.4.0/go.mod 
h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1 
h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 github.com/stretchr/testify v1.5.1/go.mod 
h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.6.1 
h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
 github.com/stretchr/testify v1.6.1/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0 
h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 github.com/stretchr/testify v1.7.0/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/yuin/goldmark v1.2.1/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod 
h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 
h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 
h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E=
-golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad 
h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
-golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod 
h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 
h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod 
h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod 
h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b 
h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg=
+golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod 
h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod 
h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344 
h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
 golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod 
h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod 
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod 
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7 
h1:3uJsdck53FDIpWwLeAXlia9p4C8j0BO2xZrqzKpL0D8=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod 
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7/go.mod 
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20210119194325-5f4716e94777 
h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew=
+golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod 
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod 
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f 
h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod 
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod 
h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210420210106-798c2154c571 
h1:Q6Bg8xzKzpFPU4Oi1sBnBTHBwlMsLeEXpu4hYBY8rAg=
+golang.org/x/net v0.0.0-20210420210106-798c2154c571/go.mod 
h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d 
h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd 
h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 
h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f 
h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 
h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 
h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM=
-golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod 
h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe 
h1:WdX7u8s3yOigWAhHEaDl8r9G+4XwFQEQFtBMYyN+kXQ=
+golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 
h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod 
h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 
h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -155,19 +136,15 @@
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod 
h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod 
h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 google.golang.org/protobuf v1.21.0/go.mod 
h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.23.0 
h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
 google.golang.org/protobuf v1.23.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 
h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod 
h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 
h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod 
h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c 
h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/group/group.go 
new/galene-0.3.4/group/group.go
--- old/galene-0.3.3/group/group.go     2021-04-16 22:31:25.000000000 +0200
+++ new/galene-0.3.4/group/group.go     2021-04-27 16:15:33.000000000 +0200
@@ -66,7 +66,7 @@
        name string
 
        mu          sync.Mutex
-       description *description
+       description *Description
        locked      *string
        clients     map[string]Client
        history     []ChatHistoryEntry
@@ -266,7 +266,7 @@
        return APIFromCodecs(codecs)
 }
 
-func Add(name string, desc *description) (*Group, error) {
+func Add(name string, desc *Description) (*Group, error) {
        if name == "" || strings.HasSuffix(name, "/") {
                return nil, UserError("illegal group name")
        }
@@ -698,31 +698,72 @@
        return false, false
 }
 
-type description struct {
-       fileName       string              `json:"-"`
-       modTime        time.Time           `json:"-"`
-       fileSize       int64               `json:"-"`
-       Description    string              `json:"description,omitempty"`
-       Contact        string              `json:"contact,omitempty"`
-       Comment        string              `json:"comment,omitempty"`
-       Redirect       string              `json:"redirect,omitempty"`
-       Public         bool                `json:"public,omitempty"`
-       MaxClients     int                 `json:"max-clients,omitempty"`
-       MaxHistoryAge  int                 `json:"max-history-age,omitempty"`
-       AllowAnonymous bool                `json:"allow-anonymous,omitempty"`
-       AllowRecording bool                `json:"allow-recording,omitempty"`
-       AllowSubgroups bool                `json:"allow-subgroups,omitempty"`
-       Autolock       bool                `json:"autolock,omitempty"`
-       Autokick       bool                `json:"autokick,omitempty"`
-       Op             []ClientCredentials `json:"op,omitempty"`
-       Presenter      []ClientCredentials `json:"presenter,omitempty"`
-       Other          []ClientCredentials `json:"other,omitempty"`
-       Codecs         []string            `json:"codecs,omitempty"`
+// Type Description represents a group description together with some
+// metadata about the JSON file it was deserialised from.
+type Description struct {
+       // The file this was deserialised from.  This is not necessarily
+       // the name of the group, for example in case of a subgroup.
+       FileName string `json:"-"`
+
+       // The modtime and size of the file.  These are used to detect
+       // when a file has changed on disk.
+       modTime time.Time `json:"-"`
+       fileSize int64 `json:"-"`
+
+       // A user-readable description of the group.
+       Description string `json:"description,omitempty"`
+
+       // A user-readable contact, typically an e-mail address.
+       Contact string `json:"contact,omitempty"`
+
+       // A user-readable comment.  Ignored by the server.
+       Comment string `json:"comment,omitempty"`
+
+       // Whether to display the group on the landing page.
+       Public bool `json:"public,omitempty"`
+
+       // A URL to redirect the group to.  If this is not empty, most
+       // other fields are ignored.
+       Redirect string `json:"redirect,omitempty"`
+
+       // The maximum number of simultaneous clients.  Unlimited if 0.
+       MaxClients int `json:"max-clients,omitempty"`
+
+       // The time for which history entries are kept.
+       MaxHistoryAge int `json:"max-history-age,omitempty"`
+
+       // Whether users are allowed to log in with an empty username.
+       AllowAnonymous bool `json:"allow-anonymous,omitempty"`
+
+       // Whether recording is allowed.
+       AllowRecording bool `json:"allow-recording,omitempty"`
+
+       // Whether subgroups are created on the fly.
+       AllowSubgroups bool `json:"allow-subgroups,omitempty"`
+
+       // Whether to lock the group when the last op logs out.
+       Autolock bool `json:"autolock,omitempty"`
+
+       // Whether to kick all users when the last op logs out.
+       Autokick bool `json:"autokick,omitempty"`
+
+       // A list of logins for ops.
+       Op []ClientCredentials `json:"op,omitempty"`
+
+       // A list of logins for presenters.
+       Presenter []ClientCredentials `json:"presenter,omitempty"`
+
+       // A list of logins for non-presenting users.
+       Other []ClientCredentials `json:"other,omitempty"`
+
+       // Codec preferences.  If empty, a suitable default is chosen in
+       // the APIFromNames function.
+       Codecs []string `json:"codecs,omitempty"`
 }
 
 const DefaultMaxHistoryAge = 4 * time.Hour
 
-func maxHistoryAge(desc *description) time.Duration {
+func maxHistoryAge(desc *Description) time.Duration {
        if desc.MaxHistoryAge != 0 {
                return time.Duration(desc.MaxHistoryAge) * time.Second
        }
@@ -765,9 +806,9 @@
 
 // descriptionChanged returns true if a group's description may have
 // changed since it was last read.
-func descriptionChanged(name string, desc *description) bool {
+func descriptionChanged(name string, desc *Description) bool {
        fi, fileName, _, err := statDescriptionFile(name)
-       if err != nil || fileName != desc.fileName {
+       if err != nil || fileName != desc.FileName {
                return true
        }
 
@@ -777,14 +818,14 @@
        return false
 }
 
-func GetDescription(name string) (*description, error) {
+func GetDescription(name string) (*Description, error) {
        r, fileName, isParent, err := openDescriptionFile(name)
        if err != nil {
                return nil, err
        }
        defer r.Close()
 
-       var desc description
+       var desc Description
 
        fi, err := r.Stat()
        if err != nil {
@@ -805,14 +846,14 @@
                desc.Description = ""
        }
 
-       desc.fileName = fileName
+       desc.FileName = fileName
        desc.fileSize = fi.Size()
        desc.modTime = fi.ModTime()
 
        return &desc, nil
 }
 
-func (desc *description) GetPermission(group string, c Challengeable) 
(ClientPermissions, error) {
+func (desc *Description) GetPermission(group string, c Challengeable) 
(ClientPermissions, error) {
        var p ClientPermissions
        if !desc.AllowAnonymous && c.Username() == "" {
                return p, UserError("anonymous users not allowed in this group, 
please choose a username")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/group/group_test.go 
new/galene-0.3.4/group/group_test.go
--- old/galene-0.3.3/group/group_test.go        2021-04-16 22:31:25.000000000 
+0200
+++ new/galene-0.3.4/group/group_test.go        2021-04-27 16:15:33.000000000 
+0200
@@ -10,8 +10,8 @@
 
 func TestGroup(t *testing.T) {
        groups.groups = nil
-       Add("group", &description{})
-       Add("group/subgroup", &description{Public: true})
+       Add("group", &Description{})
+       Add("group/subgroup", &Description{Public: true})
        if len(groups.groups) != 2 {
                t.Errorf("Expected 2, got %v", len(groups.groups))
        }
@@ -95,7 +95,7 @@
 
 func TestChatHistory(t *testing.T) {
        g := Group{
-               description: &description{},
+               description: &Description{},
        }
        for i := 0; i < 2*maxChatHistory; i++ {
                g.AddToChatHistory("id", "user", ToJSTime(time.Now()), "",
@@ -132,7 +132,7 @@
 }`
 
 func TestDescriptionJSON(t *testing.T) {
-       var d description
+       var d Description
        err := json.Unmarshal([]byte(descJSON), &d)
        if err != nil {
                t.Fatalf("unmarshal: %v", err)
@@ -143,7 +143,7 @@
                t.Fatalf("marshal: %v", err)
        }
 
-       var ddd description
+       var ddd Description
        err = json.Unmarshal([]byte(dd), &ddd)
        if err != nil {
                t.Fatalf("unmarshal: %v", err)
@@ -209,7 +209,7 @@
 }
 
 func TestPermissions(t *testing.T) {
-       var d description
+       var d Description
        err := json.Unmarshal([]byte(descJSON), &d)
        if err != nil {
                t.Fatalf("unmarshal: %v", err)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/packetcache/packetcache.go 
new/galene-0.3.4/packetcache/packetcache.go
--- old/galene-0.3.3/packetcache/packetcache.go 2021-04-16 22:31:25.000000000 
+0200
+++ new/galene-0.3.4/packetcache/packetcache.go 2021-04-27 16:15:33.000000000 
+0200
@@ -260,14 +260,15 @@
                cache.lastValid = true
                cache.expected++
        } else {
-               if compare(cache.last, seqno) <= 0 {
+               cmp := compare(cache.last, seqno)
+               if cmp < 0 {
                        cache.expected += uint32(seqno - cache.last)
                        cache.lost += uint32(seqno - cache.last - 1)
                        if seqno < cache.last {
                                cache.cycle++
                        }
                        cache.last = seqno
-               } else {
+               } else if cmp > 0 {
                        if cache.lost > 0 {
                                cache.lost--
                        }
@@ -346,7 +347,7 @@
        }
 }
 
-// Expect records that we expect n packets.  It is used for loss statistics.
+// Expect records that we expect n additional packets.
 func (cache *Cache) Expect(n int) {
        if n <= 0 {
                return
@@ -354,6 +355,7 @@
        cache.mu.Lock()
        defer cache.mu.Unlock()
        cache.expected += uint32(n)
+       cache.lost++
 }
 
 // get retrieves a packet from a slice of entries.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/packetcache/packetcache_test.go 
new/galene-0.3.4/packetcache/packetcache_test.go
--- old/galene-0.3.3/packetcache/packetcache_test.go    2021-04-16 
22:31:25.000000000 +0200
+++ new/galene-0.3.4/packetcache/packetcache_test.go    2021-04-27 
16:15:33.000000000 +0200
@@ -493,3 +493,72 @@
                t.Errorf("Expected %v, got %v", l, n)
        }
 }
+
+func TestCacheStatsFull(t *testing.T) {
+       cache := New(16)
+       for i := 0; i < 32; i++ {
+               cache.Store(uint16(i), 0, false, false, []byte{uint8(i)})
+       }
+       expected, lost, totalLost, eseqno := cache.GetStats(false)
+       if expected != 32 ||
+               lost != 0 ||
+               totalLost != 0 ||
+               eseqno != 31 {
+               t.Errorf("Expected 32, 0, 0, 31, got %v, %v, %v, %v",
+                       expected, lost, totalLost, eseqno)
+       }
+}
+
+func TestCacheStatsDrop(t *testing.T) {
+       cache := New(16)
+       for i := 0; i < 32; i++ {
+               if i != 8 {
+                       cache.Store(uint16(i), 0, false, false, 
[]byte{uint8(i)})
+               }
+       }
+       expected, lost, totalLost, eseqno := cache.GetStats(false)
+       if expected != 32 ||
+               lost != 1 ||
+               totalLost != 1 ||
+               eseqno != 31 {
+               t.Errorf("Expected 32, 1, 1, 31, got %v, %v, %v, %v",
+                       expected, lost, totalLost, eseqno)
+       }
+}
+
+func TestCacheStatsUnordered(t *testing.T) {
+       cache := New(16)
+       for i := 0; i < 32; i++ {
+               if i != 8 {
+                       cache.Store(uint16(i), 0, false, false, 
[]byte{uint8(i)})
+               }
+       }
+       cache.Store(uint16(8), 0, false, false, []byte{8})
+       expected, lost, totalLost, eseqno := cache.GetStats(false)
+       if expected != 32 ||
+               lost != 0 ||
+               totalLost != 0 ||
+               eseqno != 31 {
+               t.Errorf("Expected 32, 1, 1, 31, got %v, %v, %v, %v",
+                       expected, lost, totalLost, eseqno)
+       }
+}
+
+func TestCacheStatsNack(t *testing.T) {
+       cache := New(16)
+       for i := 0; i < 32; i++ {
+               if i != 8 {
+                       cache.Store(uint16(i), 0, false, false, 
[]byte{uint8(i)})
+               }
+       }
+       cache.Expect(1)
+       cache.Store(uint16(8), 0, false, false, []byte{8})
+       expected, lost, totalLost, eseqno := cache.GetStats(false)
+       if expected != 33 ||
+               lost != 1 ||
+               totalLost != 1 ||
+               eseqno != 31 {
+               t.Errorf("Expected 33, 1, 1, 31, got %v, %v, %v, %v",
+                       expected, lost, totalLost, eseqno)
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/static/common.css 
new/galene-0.3.4/static/common.css
--- old/galene-0.3.3/static/common.css  2021-04-16 22:31:25.000000000 +0200
+++ new/galene-0.3.4/static/common.css  2021-04-27 16:15:33.000000000 +0200
@@ -11,7 +11,7 @@
     padding-top: 0;
     border-width: thin;
     clear: both;
-    height: 3.125rem;
+    min-height: 3.125rem;
     text-align: center;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/static/galene.css 
new/galene-0.3.4/static/galene.css
--- old/galene-0.3.3/static/galene.css  2021-04-16 22:31:25.000000000 +0200
+++ new/galene-0.3.4/static/galene.css  2021-04-27 16:15:33.000000000 +0200
@@ -434,8 +434,8 @@
     display: block;
 }
 
-.collapse-video {
-    display: none;
+.chat-btn {
+    display: block;
     /*on top of video peers*/
     z-index: 1002;
     font-size: 1.8em;
@@ -445,15 +445,16 @@
     cursor: pointer;
 }
 
-.collapse-video .open-chat {
+.chat-btn .icon-chat {
     color: #cac7c7;
     height: 50px;
     padding: 10px;
     text-shadow: 0px 0px 1px #b3adad;
 }
 
-.no-video {
-    display: none;
+.collapse-video {
+    left: inherit;
+    right: 30px;
 }
 
 .video-controls, .top-video-controls {
@@ -1000,7 +1001,6 @@
 
 .show-video {
     position: absolute;
-    display: none;
     right: 30px;
     bottom: 120px;
     color: white;
@@ -1188,7 +1188,13 @@
 
 /* END Sidebar Left */
 
-@media only screen and (max-device-width: 1024px) {
+@media only screen and (min-width: 1025px) {
+    .coln-right .collapse-video, .coln-right .show-video {
+        display: none;
+    }
+}
+
+@media only screen and (max-width: 1024px) {
     #presentbutton, #unpresentbutton {
         width: auto;
     }
@@ -1214,12 +1220,7 @@
         height: calc(var(--vh, 1vh) * 100 - 56px);
     }
 
-    .collapse-video {
-        left: inherit;
-        right: 60px;
-    }
-
-    .close-chat {
+    .close-chat, .show-chat {
         display: none;
     }
 
@@ -1248,6 +1249,8 @@
     .coln-left {
         flex: 100%;
         width: 100vw;
+        /* chat is always visible here */
+        display: block !important;
     }
 
     .coln-right {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/static/galene.html 
new/galene-0.3.4/static/galene.html
--- old/galene-0.3.3/static/galene.html 2021-04-16 22:31:25.000000000 +0200
+++ new/galene-0.3.4/static/galene.html 2021-04-27 16:15:33.000000000 +0200
@@ -99,13 +99,16 @@
             </div>
             <div id="resizer"></div>
             <div class="coln-right" id="right">
-              <span class="show-video blink" id="switch-video">
+              <span class="show-video blink invisible" id="show-video">
                 <i class="fas fa-exchange-alt" aria-hidden="true"></i>
               </span>
-              <div class="collapse-video" id="collapse-video">
-                  <i class="far fa-comment-alt open-chat" title="Open 
chat"></i>
-                </div>
-              <div class="video-container no-video" id="video-container">
+              <div class="chat-btn show-chat invisible" id="show-chat">
+                <i class="far fa-comment-alt icon-chat" title="Show chat"></i>
+              </div>
+              <div class="chat-btn collapse-video invisible" 
id="collapse-video">
+                <i class="far fa-comment-alt icon-chat" title="Hide video and 
show chat"></i>
+              </div>
+              <div class="video-container invisible" id="video-container">
                 <div id="expand-video" class="expand-video">
                   <div id="peers"></div>
                 </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/static/galene.js 
new/galene-0.3.4/static/galene.js
--- old/galene-0.3.3/static/galene.js   2021-04-16 22:31:25.000000000 +0200
+++ new/galene-0.3.4/static/galene.js   2021-04-27 16:15:33.000000000 +0200
@@ -40,12 +40,6 @@
 let fallbackUserPass = null;
 
 
-/* max-device-width which is defined in css for mobile layout */
-/**
- * @type {number}
- */
-let mobileViewportWidth = 1024;
-
 /**
  * @param {string} username
  * @param {string} password
@@ -259,12 +253,10 @@
         storeSettings(settings);
 }
 
-function showVideo() {
-    let width = window.innerWidth;
-    let video_container = document.getElementById('video-container');
-    video_container.classList.remove('no-video');
-    if (width <= mobileViewportWidth)
-        document.getElementById('collapse-video').style.display = "block";
+function isMobileLayout() {
+    if (window.matchMedia('only screen and (max-width: 1024px)').matches)
+        return true;
+    return false;
 }
 
 /**
@@ -274,19 +266,16 @@
     let mediadiv = document.getElementById('peers');
     if(mediadiv.childElementCount > 0 && !force)
         return;
-    let video_container = document.getElementById('video-container');
-    video_container.classList.add('no-video');
-    let left = document.getElementById("left");
-    if (left.style.display !== "none") {
-        // hide all video buttons used to switch video on mobile layout
-        closeVideoControls();
-    }
+    setVisibility('video-container', false);
 }
 
-function closeVideoControls() {
-    // hide all video buttons used to switch video on mobile layout
-    document.getElementById('switch-video').style.display = "";
-    document.getElementById('collapse-video').style.display = "";
+function showVideo() {
+    let hasmedia = document.getElementById('peers').childElementCount > 0;
+    if(isMobileLayout()) {
+        setVisibility('show-video', false);
+        setVisibility('collapse-video', hasmedia);
+    }
+    setVisibility('video-container', hasmedia);
 }
 
 function fillLogin() {
@@ -316,7 +305,6 @@
         connectionbox.classList.remove('invisible');
         displayError('Disconnected', 'error');
         hideVideo();
-        closeVideoControls();
     }
 }
 
@@ -379,6 +367,7 @@
     document.documentElement.style.setProperty(
         '--vh', `${window.innerHeight/100}px`,
     );
+    showVideo();
     // Ajust video component size
     resizePeers();
 }
@@ -441,6 +430,8 @@
         !!HTMLVideoElement.prototype.captureStream ||
         /** @ts-ignore */
         !!HTMLVideoElement.prototype.mozCaptureStream;
+    let mediacount = document.getElementById('peers').childElementCount;
+    let mobilelayout = isMobileLayout();
 
     // don't allow multiple presentations
     setVisibility('presentbutton', canWebrtc && permissions.present && !local);
@@ -458,6 +449,8 @@
     setVisibility('mediaoptions', permissions.present);
     setVisibility('sendform', permissions.present);
     setVisibility('fileform', canFile && permissions.present);
+
+    setVisibility('collapse-video', mediacount && mobilelayout);
 }
 
 /**
@@ -2664,37 +2657,30 @@
 
 document.getElementById('collapse-video').onclick = function(e) {
     e.preventDefault();
-    if(!(this instanceof HTMLElement))
-        throw new Error('Unexpected type for this');
-    let width = window.innerWidth;
-    let left = document.getElementById("left");
-    if (left.style.display === "" || left.style.display === "none") {
-      //left chat is hidden, we show the chat and hide collapse button
-      left.style.display = "block";
-      this.style.display = "";
-    }
-    if (width <= mobileViewportWidth) {
-      // fixed div for small screen
-      this.style.display = "";
-      hideVideo(true);
-      document.getElementById('switch-video').style.display = "block";
-    }
+    setVisibility('collapse-video', false);
+    setVisibility('show-video', true);
+    hideVideo(true);
 };
 
-document.getElementById('switch-video').onclick = function(e) {
+document.getElementById('show-video').onclick = function(e) {
     e.preventDefault();
-    if(!(this instanceof HTMLElement))
-        throw new Error('Unexpected type for this');
-    showVideo();
-    this.style.display = "";
-    document.getElementById('collapse-video').style.display = "block";
+    setVisibility('video-container', true);
+    setVisibility('collapse-video', true);
+    setVisibility('show-video', false);
 };
 
 document.getElementById('close-chat').onclick = function(e) {
-  e.preventDefault();
-  let left = document.getElementById("left");
-  left.style.display = "none";
-  document.getElementById('collapse-video').style.display = "block";
+    e.preventDefault();
+    setVisibility('left', false);
+    setVisibility('show-chat', true);
+    resizePeers();
+};
+
+document.getElementById('show-chat').onclick = function(e) {
+    e.preventDefault();
+    setVisibility('left', true);
+    setVisibility('show-chat', false);
+    resizePeers();
 };
 
 async function serverConnect() {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/static/index.html 
new/galene-0.3.4/static/index.html
--- old/galene-0.3.3/static/index.html  2021-04-16 22:31:25.000000000 +0200
+++ new/galene-0.3.4/static/index.html  2021-04-27 16:15:33.000000000 +0200
@@ -8,9 +8,6 @@
     <link rel="stylesheet" href="/mainpage.css">
     <link rel="stylesheet" type="text/css" href="/galene.css"/>
     <link rel="author" href="https://www.irif.fr/~jch/"/>
-    <!-- Font Awesome File -->
-    <link href="/css/fontawesome.min.css" rel="stylesheet" type="text/css">
-    <link href="/css/solid.css" rel="stylesheet" type="text/css">
   </head>
 
   <body>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/static/mainpage.css 
new/galene-0.3.4/static/mainpage.css
--- old/galene-0.3.3/static/mainpage.css        2021-04-16 22:31:25.000000000 
+0200
+++ new/galene-0.3.4/static/mainpage.css        2021-04-27 16:15:33.000000000 
+0200
@@ -1,3 +1,9 @@
+body {
+    /* Used to move footer at bottom of the page */
+    display: flex;
+    flex-direction: column;
+}
+
 .groups {
 }
 
@@ -10,7 +16,7 @@
 }
 
 .home {
-  height: calc(100vh - 50px);
+  margin-bottom: auto;
   padding: 1.875rem;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/galene-0.3.3/static/protocol.js 
new/galene-0.3.4/static/protocol.js
--- old/galene-0.3.3/static/protocol.js 2021-04-16 22:31:25.000000000 +0200
+++ new/galene-0.3.4/static/protocol.js 2021-04-27 16:15:33.000000000 +0200
@@ -410,14 +410,15 @@
  * @param {string} localId
  * @returns {Stream}
  */
-
 ServerConnection.prototype.findByLocalId = function(localId) {
     if(!localId)
         return null;
 
-    for(let id in serverConnection.up) {
-        let s = serverConnection.up[id];
-        if(s.localId == localId)
+    let sc = this;
+
+    for(let id in sc.up) {
+        let s = sc.up[id];
+        if(s.localId === localId)
             return s;
     }
     return null;
@@ -728,7 +729,7 @@
  * @param {string} id
  * @function
  */
-ServerConnection.prototype.gotRenegotiate = async function(id) {
+ServerConnection.prototype.gotRenegotiate = function(id) {
     let c = this.up[id];
     if(!c)
         throw new Error('unknown up stream');

++++++ vendor.tar.gz ++++++
++++ 36558 lines of diff (skipped)

Reply via email to