From ef9fad9cfd6cc07758b2bbd320c8d1f15be49888 Mon Sep 17 00:00:00 2001
From: Ingo Bauersachs <ingo@jitsi.org>
Date: Sat, 8 Feb 2014 21:58:36 +0100
Subject: [PATCH] Let ZRTP childstreams report the verification status of the
 main stream

---
 .../transform/zrtp/SecurityEventManager.java  | 45 +++++++++----------
 .../transform/zrtp/ZrtpControlImpl.java       |  7 +--
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/src/org/jitsi/impl/neomedia/transform/zrtp/SecurityEventManager.java b/src/org/jitsi/impl/neomedia/transform/zrtp/SecurityEventManager.java
index 1e76e1bc..09519974 100644
--- a/src/org/jitsi/impl/neomedia/transform/zrtp/SecurityEventManager.java
+++ b/src/org/jitsi/impl/neomedia/transform/zrtp/SecurityEventManager.java
@@ -58,14 +58,14 @@ public class SecurityEventManager extends ZrtpUserCallback
     private final ZrtpControlImpl zrtpControl;
 
     /**
-     * A callback to the instance that created us.
+     * The event manager that belongs to the ZRTP master session.
      */
-    private SrtpListener securityListener;
+    private SecurityEventManager masterEventManager;
 
     /**
-     * Is this a ZRTP DH (Master) session?
+     * A callback to the instance that created us.
      */
-    private boolean isDHSession = false;
+    private SrtpListener securityListener;
 
     /**
      * The type of this session.
@@ -89,7 +89,7 @@ public class SecurityEventManager extends ZrtpUserCallback
 
     /**
      * The class constructor.
-     *
+     * 
      * @param zrtpControl that this manager is to be associated with.
      */
     public SecurityEventManager(ZrtpControlImpl zrtpControl)
@@ -109,13 +109,12 @@ public void setSessionType(MediaType sessionType)
     }
 
     /**
-     * Set the DH session flag.
-     *
-     * @param isDHSession the DH session flag.
+     * Sets the event manager that belongs to the ZRTP master session.
+     * @param master the event manager that belongs to the ZRTP master session.
      */
-    public void setDHSession(boolean isDHSession)
+    void setMasterEventManager(SecurityEventManager master)
     {
-        this.isDHSession = isDHSession;
+        this.masterEventManager = master;
     }
 
     /*
@@ -164,7 +163,7 @@ public void showSAS(String sas, boolean isVerified)
      */
     public void setSASVerified(boolean isVerified)
     {
-        this.isSasVerified = sas != null && isVerified;
+        this.isSasVerified = getSecurityString() != null && isVerified;
     }
 
     /**
@@ -209,17 +208,8 @@ public void showMessage(ZrtpCodes.MessageSeverity sev,
             // Multi-stream session don't have own SAS data
             if (inf == ZrtpCodes.InfoCodes.InfoSecureStateOn)
             {
-                if (isDHSession)
-                {
-                    securityListener.securityTurnedOn(
-                        sessionType, cipher,
+                securityListener.securityTurnedOn(sessionType, cipher,
                         zrtpControl);
-                }
-                else
-                {
-                    securityListener.securityTurnedOn(sessionType, cipher,
-                                                zrtpControl);
-                }
             }
         }
         else if (msgCode instanceof ZrtpCodes.WarningCodes)
@@ -311,8 +301,7 @@ else if (msgCode instanceof ZrtpCodes.ZrtpErrorCodes)
             logger.debug(
                     sessionTypeToString(sessionType)
                         + ": ZRTP message: severity: " + sev + ", sub code: "
-                        + msgCode + ", DH session: " + isDHSession + ", multi: "
-                        + multiStreams);
+                        + msgCode + ", multi: " + multiStreams);
         }
     }
 
@@ -440,6 +429,11 @@ public void setSrtpListener(SrtpListener securityListener)
      */
     public String getSecurityString()
     {
+        if (masterEventManager != null && masterEventManager != this)
+        {
+            return masterEventManager.sas;
+        }
+
         return sas;
     }
 
@@ -460,6 +454,11 @@ public String getCipherString()
      */
     public boolean isSecurityVerified()
     {
+        if (masterEventManager != null && masterEventManager != this)
+        {
+            return masterEventManager.isSasVerified;
+        }
+
         return isSasVerified;
     }
 
diff --git a/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java b/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java
index 98afb060..79f7414b 100644
--- a/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java
+++ b/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java
@@ -302,11 +302,13 @@ public void setMultistream(SrtpControl master)
         if(!(master instanceof ZrtpControlImpl))
             throw new IllegalArgumentException("master is no ZRTP control");
 
+        ZrtpControlImpl zm = (ZrtpControlImpl)master;
         ZRTPTransformEngine engine = getTransformEngine();
 
-        engine.setMultiStrParams(((ZrtpControlImpl) master)
-            .getTransformEngine().getMultiStrParams());
+        engine.setMultiStrParams(zm.getTransformEngine().getMultiStrParams());
         engine.setEnableZrtp(true);
+        engine.getUserCallback().setMasterEventManager(
+                zm.getTransformEngine().getUserCallback());
     }
 
     /**
@@ -350,7 +352,6 @@ public void start(MediaType mediaType)
         if (masterSession)
         {
             zrtpAutoStart = true;
-            securityEventManager.setDHSession(true);
 
             // we know that audio is considered as master for zrtp
             securityEventManager.setSessionType(mediaType);
-- 
GitLab