Make sure attributes propagate through security wrappers

Both SSecurityVeNCrypt and SSecurityStack are wrappers around other
security objects, so they need to delegate the properties of those
sub-objects properly.
diff --git a/common/rfb/SSecurityStack.cxx b/common/rfb/SSecurityStack.cxx
index 9ddc9f2..478ce4f 100644
--- a/common/rfb/SSecurityStack.cxx
+++ b/common/rfb/SSecurityStack.cxx
@@ -65,3 +65,20 @@
 
   return c;
 }
+
+SConnection::AccessRights SSecurityStack::getAccessRights() const
+{
+  SConnection::AccessRights accessRights;
+
+  if (!state0 && !state1)
+    return SSecurity::getAccessRights();
+
+  accessRights = SConnection::AccessFull;
+
+  if (state0)
+    accessRights &= state0->getAccessRights();
+  if (state1)
+    accessRights &= state1->getAccessRights();
+
+  return accessRights;
+}
diff --git a/common/rfb/SSecurityStack.h b/common/rfb/SSecurityStack.h
index c80a3b9..dd743d2 100644
--- a/common/rfb/SSecurityStack.h
+++ b/common/rfb/SSecurityStack.h
@@ -31,6 +31,7 @@
     virtual bool processMsg(SConnection* cc);
     virtual int getType() const { return type; };
     virtual const char* getUserName() const;
+    virtual SConnection::AccessRights getAccessRights() const;
   protected:
     short state;
     SSecurity* state0;
diff --git a/common/rfb/SSecurityVeNCrypt.cxx b/common/rfb/SSecurityVeNCrypt.cxx
index 39647f6..7c13749 100644
--- a/common/rfb/SSecurityVeNCrypt.cxx
+++ b/common/rfb/SSecurityVeNCrypt.cxx
@@ -171,3 +171,16 @@
   return ssecurity->processMsg(sc);
 }
 
+const char* SSecurityVeNCrypt::getUserName() const
+{
+  if (ssecurity == NULL)
+    return NULL;
+  return ssecurity->getUserName();
+}
+
+SConnection::AccessRights SSecurityVeNCrypt::getAccessRights() const
+{
+  if (ssecurity == NULL)
+    return SSecurity::getAccessRights();
+  return ssecurity->getAccessRights();
+}
diff --git a/common/rfb/SSecurityVeNCrypt.h b/common/rfb/SSecurityVeNCrypt.h
index 849a702..f9c753f 100644
--- a/common/rfb/SSecurityVeNCrypt.h
+++ b/common/rfb/SSecurityVeNCrypt.h
@@ -39,8 +39,9 @@
     SSecurityVeNCrypt(SecurityServer *sec);
     ~SSecurityVeNCrypt();
     virtual bool processMsg(SConnection* sc);// { return true; }
-    virtual int getType() const { return secTypeVeNCrypt; }
-    virtual const char* getUserName() const { return NULL; }
+    virtual int getType() const { return chosenType; }
+    virtual const char* getUserName() const;
+    virtual SConnection::AccessRights getAccessRights() const;
 
   protected:
     SSecurity *ssecurity;