@ -14,15 +14,6 @@
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*
* - -
*
* ZeroTier may be used and distributed under the terms of the GPLv3 , which
* are available at : http : //www.gnu.org/licenses/gpl-3.0.html
*
* If you would like to embed ZeroTier into a commercial application or
* redistribute it in a modified binary form , please contact ZeroTier Networks
* LLC . Start here : http : //www.zerotier.com/
*/
# include <stdint.h>
@ -639,7 +630,6 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
member [ " id " ] = identity . address ( ) . toString ( ) ;
member [ " address " ] = member [ " id " ] ;
member [ " nwid " ] = network [ " id " ] ;
member [ " lastModified " ] = now ;
member [ " memberRevision " ] = member . value ( " memberRevision " , 0ULL ) + 1 ;
// Update member log
@ -666,14 +656,12 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
member [ " recentLog " ] = recentLog ;
}
if ( ! member . value ( " authorized " , false ) ) {
if ( network . value ( " private " , true ) ) {
_writeJson ( memberJP , member ) ;
return NetworkController : : NETCONF_QUERY_ACCESS_DENIED ;
} else {
member [ " authorized " ] = true ; // auto-authorize on public networks
}
// Stop if network is private and member is not authorized
if ( ( network . value ( " private " , true ) ) & & ( ! member . value ( " authorized " , false ) ) ) {
_writeJson ( memberJP , member ) ;
return NetworkController : : NETCONF_QUERY_ACCESS_DENIED ;
}
// Else compose and send network config
nc . networkId = nwid ;
nc . type = network . value ( " private " , true ) ? ZT_NETWORK_TYPE_PRIVATE : ZT_NETWORK_TYPE_PUBLIC ;
@ -1094,6 +1082,7 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
try {
if ( b . count ( " authorized " ) ) member [ " authorized " ] = b . value ( " authorized " , false ) ;
if ( ( b . count ( " identity " ) ) & & ( ! member . count ( " identity " ) ) ) member [ " identity " ] = b . value ( " identity " , " " ) ; // allow identity to be populated only if not already known
if ( b . count ( " ipAssignments " ) ) {
auto ipa = b [ " ipAssignments " ] ;
if ( ipa . is_array ( ) ) {
@ -1119,8 +1108,8 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
member [ " id " ] = addrs ;
member [ " address " ] = addrs ; // legacy
member [ " nwid " ] = nwids ;
member [ " lastModified " ] = OSUtils : : now ( ) ;
member [ " memberRevision " ] = member . value ( " memberRevision " , 0ULL ) + 1 ;
member [ " objtype " ] = " member " ;
_writeJson ( _memberJP ( nwid , Address ( address ) , true ) . c_str ( ) , member ) ;
@ -1144,12 +1133,12 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
auto hops2 = hops [ i ] ;
if ( hops2 . is_array ( ) ) {
for ( unsigned long j = 0 ; j < hops2 . size ( ) ; + + j ) {
std : : string hop = hops2 [ j ] ;
test - > hops [ test - > hopCount ] . addresses [ test - > hops [ test - > hopCount ] . breadth + + ] = Utils : : hexStrToU64 ( hop . c_str ( ) ) & 0xffffffffffULL ;
std : : string s = hops2 [ j ] ;
test - > hops [ test - > hopCount ] . addresses [ test - > hops [ test - > hopCount ] . breadth + + ] = Utils : : hexStrToU64 ( s . c_str ( ) ) & 0xffffffffffULL ;
}
} else if ( hops2 . is_string ( ) ) {
std : : string hop = hops2 ;
test - > hops [ test - > hopCount ] . addresses [ test - > hops [ test - > hopCount ] . breadth + + ] = Utils : : hexStrToU64 ( hop . c_str ( ) ) & 0xffffffffffULL ;
std : : string s = hops2 ;
test - > hops [ test - > hopCount ] . addresses [ test - > hops [ test - > hopCount ] . breadth + + ] = Utils : : hexStrToU64 ( s . c_str ( ) ) & 0xffffffffffULL ;
}
}
}
@ -1303,11 +1292,20 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
if ( b . count ( " rules " ) ) {
auto rules = b [ " rules " ] ;
if ( rules . is_array ( ) ) {
json nrules = json : : array ( ) ;
for ( unsigned long i = 0 ; i < rules . size ( ) ; + + i ) {
auto rule = rules [ i ] ;
json rule = rules [ i ] ;
if ( rule . is_object ( ) ) {
ZT_VirtualNetworkRule ztr ;
if ( _parseRule ( rule , ztr ) ) {
rule = _renderRule ( ztr ) ;
if ( ( rule . is_object ( ) ) & & ( rule . count ( " type " ) ) ) {
nrules . push_back ( rule ) ;
}
}
}
}
network [ " rules " ] = nrules ;
}
}
} catch ( . . . ) {
@ -1323,12 +1321,17 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
if ( ! network . count ( " activeBridges " ) ) network [ " activeBridges " ] = json : : array ( ) ;
if ( ! network . count ( " rules " ) ) {
// If unspecified, rules are set to allow anything and behave like a flat L2 segment
network [ " rules " ] = {
{ " not " , false } ,
{ " type " , " ACTION_ACCEPT " }
} ;
}
network [ " id " ] = nwids ;
network [ " nwid " ] = nwids ; // legacy
network [ " lastModified " ] = OSUtils : : now ( ) ;
network [ " revision " ] = network . value ( " revision " , 0ULL ) + 1ULL ;
network [ " objtype " ] = " network " ;
_writeJson ( _networkJP ( nwid , true ) , network ) ;