Lemonldap-NG-Manager
view release on metacpan or search on metacpan
lib/Lemonldap/NG/Manager/Conf/Parser.pm view on Meta::CPAN
# Unless $h is set, scan subnodes and check changes
else {
hdebug(' 3 levels only (missing $h)');
if ( ref $subNodes ) {
hdebug(' has subnodes');
$self->_scanNodes($subNodes)
or return 0;
}
if ( exists $self->refConf->{$target}->{$key}
and %{ $self->refConf->{$target}->{$key} } )
{
hdebug(' old conf subnode has values');
my $c = $self->newConf->{$target};
foreach my $k (
keys %{ $self->refConf->{$target}->{$key} } )
{
unless ( defined $c->{$key}->{$k} ) {
hdebug(' missing value in old conf');
$self->confChanged(1);
push @{ $self->changes },
{
key => "$target, $key",
old => $k,
};
}
}
}
elsif ( exists $self->newConf->{$target}->{$key}
and %{ $self->newConf->{$target}->{$key} } )
{
hdebug(" '$key' has values");
$self->confChanged(1);
push @{ $self->changes },
{ key => "$target", new => $key };
}
}
}
elsif ( $target =~ /^$virtualHostKeys$/ ) {
$self->set( 'vhostOptions', [ $oldName, $key ],
$target, $leaf->{data} );
}
else {
push @{ $self->errors },
{ message => "Unknown vhost key $target" };
return 0;
}
next;
}
# SAML
elsif ( $base =~ /^saml(?:S|ID)PMetaDataNodes$/ ) {
hdebug('SAML');
if ( defined $leaf->{data}
and ref( $leaf->{data} ) eq 'ARRAY' )
{
hdebug(" SAML data is an array, serializing");
$leaf->{data} = join ';', @{ $leaf->{data} };
}
if ( $target =~
/^saml(?:S|ID)PMetaData(?:ExportedAttributes|Macros)$/ )
{
if ( $leaf->{cnodes} ) {
hdebug(" $target: unopened node");
$self->newConf->{$target}->{$key} =
$self->refConf->{$target}->{$oldName} // {};
}
elsif ($h) {
hdebug(" $target: opened node");
$self->confChanged(1);
$self->set( $target, $key, $leaf->{title},
$leaf->{data} );
}
elsif ( !@$subNodes ) {
hdebug(" $target: no subnodes");
$self->confChanged(1);
}
else {
hdebug(" $target: scanning subnodes");
$self->_scanNodes($subNodes);
}
}
elsif ( $target =~ /^saml(?:S|ID)PMetaDataXML$/ ) {
hdebug(" $target");
$self->set( $target, [ $oldName, $key ],
$target, $leaf->{data} );
}
elsif ( $target =~ /^saml(?:S|ID)PMetaDataURL$/ ) {
hdebug(" $target");
$self->set( $target, [ $oldName, $key ],
$target, $leaf->{data} );
}
elsif ( $target =~ /^saml(?:ID|S)PMetaDataOptions/ ) {
my $optKey = $&;
hdebug(" $base sub key: $target");
if ( $target =~
/^(?:$samlIDPMetaDataNodeKeys|$samlSPMetaDataNodeKeys)/
)
{
$self->set(
$optKey, [ $oldName, $key ],
$target, $leaf->{data}
);
}
else {
push @{ $self->errors },
{ message => "Unknown SAML metadata option $target" };
return 0;
}
}
else {
push @{ $self->errors },
{ message => "Unknown SAML key $target" };
return 0;
}
next;
}
# OIDC
elsif ( $base =~ /^oidc(?:O|R)PMetaDataNodes$/ ) {
hdebug('OIDC');
if ( $target =~ /^oidc(?:O|R)PMetaDataOptions$/ ) {
hdebug(" $target: looking for subnodes");
$self->_scanNodes($subNodes);
$self->set( $target, $key, $leaf->{title}, $leaf->{data} );
}
elsif ( $target =~ /^oidcOPMetaData(?:JSON|JWKS)$/ ) {
hdebug(" $target");
$self->set( $target, $key, $leaf->{data} );
}
elsif ( $target =~ /^oidcRPMetaDataExportedVars$/ ) {
hdebug(" $target");
if ( $leaf->{cnodes} ) {
hdebug(' unopened');
$self->newConf->{$target}->{$key} =
$self->refConf->{$target}->{$oldName} // {};
}
elsif ($h) {
hdebug(' opened');
$self->confChanged(1);
my $tmp = $leaf->{data};
if ( ref( $leaf->{data} ) eq 'ARRAY' ) {
# Forward compatibility. If Type and Array have
# default values, store in old format
if ( $leaf->{data}->[1] eq "string"
and $leaf->{data}->[2] eq "auto" )
{
$tmp = $leaf->{data}->[0];
}
else {
$tmp = join ';', @{ $leaf->{data} };
}
}
$self->set( $target, $key, $leaf->{title}, $tmp );
}
elsif ( !@$subNodes ) {
hdebug(" $target: no subnodes");
$self->confChanged(1);
}
else {
hdebug(" $target: scanning subnodes");
$self->_scanNodes($subNodes);
}
}
elsif ( $target =~
/^oidc(?:O|R)PMetaData(?:ExportedVars|Macros|ScopeRules)$/ )
{
hdebug(" $target");
if ( $leaf->{cnodes} ) {
hdebug(' unopened');
$self->newConf->{$target}->{$key} =
$self->refConf->{$target}->{$oldName} // {};
}
elsif ($h) {
hdebug(' opened');
$self->confChanged(1);
$self->set( $target, $key, $leaf->{title},
$leaf->{data} );
}
elsif ( !@$subNodes ) {
hdebug(" $target: no subnodes");
$self->confChanged(1);
}
else {
hdebug(" $target: scanning subnodes");
$self->_scanNodes($subNodes);
}
}
elsif ( $target =~ /^oidc(?:O|R)PMetaDataOptions/ ) {
my $optKey = $&;
hdebug " $base sub key: $target";
if ( $target eq 'oidcRPMetaDataOptionsExtraClaims' ) {
if ( $leaf->{cnodes} ) {
hdebug(' unopened');
$self->newConf->{$target}->{$key} =
$self->refConf->{$target}->{$oldName} // {};
}
elsif ($h) {
hdebug(' opened');
$self->set( $target, $key, $leaf->{title},
$leaf->{data} );
}
elsif ( !@$subNodes ) {
hdebug(" $target: no subnodes");
$self->confChanged(1);
}
else {
hdebug(" $target: scanning subnodes");
$self->_scanNodes($subNodes);
}
}
elsif ( $target =~
/^(?:$oidcOPMetaDataNodeKeys|$oidcRPMetaDataNodeKeys)/ )
{
$self->set(
$optKey, [ $oldName, $key ],
$target, $leaf->{data}
);
}
else {
push @{ $self->errors },
{ message => "Unknown OIDC metadata option $target" };
return 0;
}
}
else {
push @{ $self->errors },
{ message => "Unknown OIDC key $target" };
return 0;
}
next;
}
# CAS
elsif ( $base =~ /^cas(?:App|Srv)MetaDataNodes$/ ) {
my $optKey = $&;
hdebug('CAS');
if ( $target =~ /^cas(?:App|Srv)MetaDataOptions$/ ) {
hdebug(" $target: looking for subnodes");
$self->_scanNodes($subNodes);
$self->set( $target, $key, $leaf->{title}, $leaf->{data} );
}
elsif ( $target =~
/^cas(?:App|Srv)MetaData(?:ExportedVars|Macros)$/ )
{
hdebug(" $target");
if ( $leaf->{cnodes} ) {
hdebug(' unopened');
$self->newConf->{$target}->{$key} =
$self->refConf->{$target}->{$oldName} // {};
}
elsif ($h) {
hdebug(' opened');
$self->confChanged(1);
$self->set( $target, $key, $leaf->{title},
$leaf->{data} );
}
elsif ( !@$subNodes ) {
hdebug(" $target: no subnodes");
$self->confChanged(1);
}
else {
hdebug(" $target: scanning subnodes");
$self->_scanNodes($subNodes);
}
}
elsif ( $target =~ /^cas(?:Srv|App)MetaDataOptions/ ) {
my $optKey = $&;
hdebug " $base sub key: $target";
if ( $target eq 'casSrvMetaDataOptionsProxiedServices' ) {
if ( $leaf->{cnodes} ) {
hdebug(' unopened');
$self->newConf->{$target}->{$key} =
$self->refConf->{$target}->{$oldName} // {};
}
elsif ($h) {
hdebug(' opened');
$self->set( $target, $key, $leaf->{title},
$leaf->{data} );
}
elsif ( !@$subNodes ) {
hdebug(" $target: no subnodes");
$self->confChanged(1);
}
else {
hdebug(" $target: scanning subnodes");
$self->_scanNodes($subNodes);
}
}
elsif ( $target =~
/^(?:$casSrvMetaDataNodeKeys|$casAppMetaDataNodeKeys)/ )
{
$self->set(
$optKey, [ $oldName, $key ],
$target, $leaf->{data}
);
}
else {
push @{ $self->errors },
{ message => "Unknown CAS metadata option $target" };
return 0;
}
}
else {
( run in 0.630 second using v1.01-cache-2.11-cpan-39bf76dae61 )