#
# Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
# which accompanies this distribution, and is available
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
#
# Initial Contributors:
# Nokia Corporation - initial contribution.
#
# Contributors:
#
# Description:
# This scripts scans all header files under .\security folder to see if they are classifed properly.
# DEF098862: Categorisation tags need to be checked for all of security sub-system
#
use Cwd;
my $masterdir = "$ENV{'SECURITYSOURCEDIR'}";
my $keyTagFile = "@" . "file";
my $keyTagInternal = "@" . "internal";
my $keyTagPublished = "@" . "published";
my $numfiles = 0;
my $numuntagged = 0;
my $numtagged = 0;
$logFile = "\\epoc32\\winscw\\c\\searchtags.txt";
#
#Function to write log into file
#
sub WriteLog
{
my ($log) = @_;
unless( open($fh, ">> $logFile"))
{
printf STDERR "Can\'t open $logfile:$!\n";
return;
}
printf $fh $log;
printf $log;
close $fh;
}
#
#Main
#
unlink($logFile);
WriteLog("Searching Classification Tags test.\n\n");
WriteLog("Scans all header files to make sure that all the files are already classified correctly at file level.\n");
WriteLog("A properly classifed header file must contain an \@file tag and then one of the following API classification tags:\n");
WriteLog("\@publishedAll, \@publishedPartner, \@internalAll, \@internalTechnology or \@internalComponent\n\n");
#check if the folder is really exists
if ( ! -d $masterdir )
{
WriteLog("Can't find `$masterdir'\n");
}
else
{
chdir $masterdir;
&SearchFolder($masterdir);
}
#
# Display the result
#
WriteLog("\n\nTests completed OK\n");
WriteLog(sprintf "Run: %d\n", $numfiles);
WriteLog(sprintf "Passed: %d\n", $numtagged);
WriteLog(sprintf "%d tests failed out of %d\n", $numuntagged, $numfiles);
#
#Function to check a file to see whether it has any file level classification tag
#
sub SearchEngine
{
my ($filename) = @_;
my $fileexist = 0;
my $fileleveltag = 0;
my $subleveltag = 0;
my $distance = 0;
if ( lc(substr($filename,-2)) eq ".h" )
{
++$numfiles;
$pid = open FILE, "<$filename";
while (<FILE>)
{
chop;
if($distance)
{
++$distance;
}
if ((/$keyTagFile/)) #check if file level tag exists
{
++$fileexist;
++$distance;
}
if((/$keyTagInternal/) || (/$keyTagPublished/)) #check if the classification tag exists
{
if(($fileexist == 1) && ($fileleveltag == 0))
{
if($distance < 15)#if the classification tag is far away, it means it belongs to something else.
{
++$fileleveltag;
$distance = 0;
}
}
elsif(($fileexist == 1) && ($fileleveltag == 1))
{
++$subleveltag;
}
}
}
if (($fileexist!=1) || ($fileleveltag != 1))
{
++$numuntagged;
WriteLog("$filename: $_\nFailed\n");
}
else
{
++$numtagged;
}
close FILE;
#print "fileexist=$fileexist fileleveltag=$fileleveltag\n";
}
}
#
#Function to search all subfolders of the given base folder
#
sub SearchFolder
{
local($dir,$nlink) = @_;
local($dev,$ino,$mode,$subcount);
($dev,$ino,$mode,$nlink) = stat('.') unless $nlink;
opendir(DIR,'.') || die "Can't open $dir";
local(@filenames) = readdir(DIR);
closedir(DIR);
if ($nlink == 2)
{# There is no subdirectories.
for (@filenames)
{
next if $_ eq '.';
next if $_ eq '..';
SearchEngine("$dir/$_");
}
}
else
{# There are some subdirectories.
$subcount = $nlink - 2;
for (@filenames)
{
next if $_ eq '.';
next if $_ eq '..';
next if lc(substr($_,0,4)) eq "test"; #Ignore test files
next if lc(substr($_,0,7)) eq "openssl"; #Ignore openssl files
next if lc(substr($_,0,9)) eq "wincrypto"; #Ignore wincrypto files
next if lc(substr($_,0,4)) eq "utf8"; #Ignore utf8.h sntpclient
next if lc(substr($_,0,10))eq "sntpclient"; #Ignore sntpclient
next if lc(substr($_,0,6)) eq "xerces"; #Ignore xerces
next if lc(substr($_,0,6)) eq "sqlite"; #Ignore sqlite
next if lc(substr($_,0,9)) eq "switestfw"; #Ignore switestfw
$name = "$dir/$_";
SearchEngine("$name");
# If checked all the subdirs
next if $subcount == 0;
($dev,$ino,$mode,$nlink) = lstat($_);
next unless -d _;
chdir $_ || die "Can't cd to $name";
&SearchFolder($name,$nlink);
chdir '..';
--$subcount;
}
}
}
# end.