LdapJS server exop handling fails - ldap

I am using the LDAP server functionality of the Node.js module ldapjs version 1.0.2. I want to handle an LDAP 1.3.6.1.4.1.4203.1.11.1 extended operation (see RFC 3062 = LDAP Password Modify).
My server is configured...
const server = ldapjs.createServer( ... );
...
server.exop('1.3.6.1.4.1.4203.1.11.1', (req: any, res: any, next: any) => {
const requestValue = req.requestValue;
});
Calling the command ldappasswd (from debian package ldap-utils) works, handler method is called in proper way.
The data from the ldappasswd ... uid=user -A -S command with "old" as old password and "new" with new password results in the following hex values:
30 14 80 08 75 69 64 3d 73 75 72 66 81 03 6f 6c 64 82 03 6e 65 77
0 u i d = u s e r o l d n e w
0x80 marks the beginning of the attribute, 0x81 the beginning of the old password, 0x82 the beginning of the new password. The value after this byte is the length, followed by the information itself.
The problem:
Inside the handler methode, requestValue is a string with invalid separator characters.
0uid=user�old�new
Converting the string to a buffer ( Buffer.from(req.reuqestValue ) results in:
<Buffer 30 14 ef bf bd 08 75 69 64 3d 75 73 65 72 ef bf bd 03 6f 6c 64 ef bf bd 03 6e 65 77>
The separator bytes 0x80, 0x81 and 0x82 are converted to ef bf bd and therefore parsing information fails, because type is lost.
Any idea how to get out the information values from the requestValue attribute?

The problem can be solved by installing the version next and using req.requestValueBuffer instead of req.requestValue:
npm install --save ldapjs#next
const server = ldapjs.createServer( ... );
...
server.exop('1.3.6.1.4.1.4203.1.11.1', (req: any, res: any, next: any) => {
const requestValue = req.requestValueBuffer;
})
The problem is caused by a bug in the current ldapjs master branch (ad451edc) in file lib/messages/ext_request.js line 61:
this.requestName = ber.readString(0x80);
if (ber.peek() === 0x81)
try {
this.requestValue = ber.readString(0x81);
} catch (e) {
this.requestValue = ber.readBuffer(0x81);
}
In case of ldappasswd data the readString() function is called (no exception thrown), and this function always converts the buffer to a string using UTF-8 decoding. That's wrong. An additional bug in this code snippet is the call of readBuffer(...) which doesn't exist on the object ber.
In the branch next of the ldapjs repository this bug is solved by the bugfix in commit b87e4bb.
Bugfix lib/messages/ext_request.js line 82:
this.requestName = ber.readString(0x80)
if (ber.peek() === 0x81) {
this.requestValueBuffer = ber.readString(0x81, true)
this.requestValue = this.requestValueBuffer.toString('utf8')
}
A handler method can now use req.requestValueBuffer to get the original request data bytes.

Related

Agora: Why my m3u8 file does not contain timestamp?

I'm using agora composition recording and want to retrieve the start timestamp to build Synchronous playback.
The document says You can find the start timestamp at the start of each M3U8 file, however my M3U8 file does not contain any timestamp.
I can convert the output files (ts and m3u8) to mp4 by ffmpeg as expected.
The request body for start api is below;
const url = `${agoraApi}/v1/apps/${appId}/cloud_recording/resourceid/${resourceId}/mode/mix/start`
const body = {
cname,
uid,
clientRequest: {
token,
storageConfig: {
vendor: 1, // Amazon S3,
region: 10, // AP_NORTHEAST_1
accessKey: process.env.AWS_ACCESS_KEY_ID,
secretKey: process.env.AWS_SECRET_ACCESS_KEY,
bucket: process.env.AWS_S3_BUCKET,
fileNamePrefix: ["records"],
},
recordingConfig: {
channelType: 1, // default. 0: Communication profile, 1: Live broadcast profile
// maxIdleTime: 30, // seconds (default)
transcodingConfig: {
width: 640, // default
height: 360, // default
fps: 15, // default
bitrate: 600,
mixedVideoLayout: 0, // default
},
},
},
};
The output M3U8 file
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:18
#EXTINF:16.038000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064340040.ts
#EXTINF:15.972000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064357105.ts
#EXTINF:16.038000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064413077.ts
#EXTINF:15.971000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064429115.ts
#EXTINF:16.039000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064445086.ts
#EXTINF:15.972000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064501125.ts
#EXTINF:15.972000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064517097.ts
#EXTINF:16.038000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064533069.ts
#EXTINF:15.972000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064549107.ts
#EXTINF:16.038000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064605079.ts
#EXTINF:15.972000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064621117.ts
#EXTINF:16.038000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064637088.ts
#EXTINF:11.679000
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064653127.ts
#EXT-X-ENDLIST
Am i missing some configuration?
While you are correct to point out that there is no Epoch/Unix timestamp, there is a "timestamp" included the name of each segment. If you notice at the end of the name of the segments, is a human readable date and time.
for example, the first .ts file is named:
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064340040.ts
If you split the name using the _ as the delimiter, the last element of the array is your timestamp. using the above name for example, the time-stamp would be 20210603064340040.
Taking this further you can break this down as:
yyyy mm dd hh mm ss ms
------------------------
2021 06 03 06 43 40 040
Using the next three files in the list we can see
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064357105.ts
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064413077.ts
8893be119d40bbc66f7ef9a26a676a12_live-aea67a87-f821-4234-894b-1512fcdae181_20210603064429115.ts
yyyy mm dd hh mm ss ms
------------------------
2021 06 03 06 43 57 105
2021 06 03 06 44 13 077
2021 06 03 06 44 29 115

Sinon test error with whois-json

I have a service API which up until recently used the whois library to get data.
I use sinon to test the API:
const mockWhoisLookup = sinon.mock(whois);
mockWhoisLookup
.expects('lookup')
.once()
.withArgs('deals.dk')
.callsFake((domain, callback) => {
callback(undefined, whoisSampleResponse);
});
I've decided to use whois-json instead as it provides a 'cleaner' output.
The issue is that when I now run the test it gives me an error output:
TypeError: Attempted to wrap undefined property lookup as function
61 | const mockWhoisLookup = sinon.mock(whois);
62 | mockWhoisLookup
> 63 | .expects('lookup')
64 | .once()
65 | .withArgs('deals.dk')
66 | .callsFake((domain, callback) => {
How do I solve this issue?

Cannot use threads to insert data to PostgreSQL with DBIish. What's going wrong?

Edit: This was solved by moritz. I've added a note to the code on the line that's wrong.
My application is a web server talking to a game client. The server is multithreaded, which Postgres allows. When loading client data into the database, I noticed parallel requests fail with several different errors, none of which make sense to me.
This short-ish test case dumps a nested hash into the database. When run without start, it works perfectly. When run with threads, it almost always gives one or more of the following errors:
DBDish::Pg: Error: (7) in method prepare at
D:\rakudo\share\perl6\site\sources\BAD7C1548F63C7AA7BC86BEDDA0F7BD185E141AD
(DBDish::Pg::Connection) line 48 in block at testcase.p6 line 62
in sub add-enum-mappings at testcase.p6 line 59 in block at
testcase.p6 line 91
DBDish::Pg: Error: ERROR: prepared statement
"pg_3448_16" already exists (7) in method prepare at
D:\rakudo\share\perl6\site\sources\BAD7C1548F63C7AA7BC86BEDDA0F7BD185E141AD
(DBDish::Pg::Connection) line 46 in block at testcase.p6 line 62
in sub add-enum-mappings at testcase.p6 line 59 in block at
testcase.p6 line 91
DBDish::Pg: Error: Wrong number of arguments to
method execute: got 1, expected 0 (-1) in method enter-execute at
D:\rakudo\share\perl6\site\sources\65FFB78EFA3030486D1C4D339882A410E3C94AD2
(DBDish::StatementHandle) line 40 in method execute at
D:\rakudo\share\perl6\site\sources\B3190B6E6B1AA764F7521B490408245094C6AA87
(DBDish::Pg::StatementHandle) line 52 in sub add-enum-mappings at
testcase.p6 line 54 in block at testcase.p6 line 90
message type 0x31 arrived from server while idle
message type 0x5a arrived from server while idle
message type 0x74 arrived from server while idle
message type 0x6e arrived from server while idle
message type 0x5a arrived from server while idle
Here's the code. (If you choose to run it, remember to set the right password. It creates/manipulates a table called "enummappings", but does nothing else.) The meat is in add-enum-mappings(). Everything else is just setup. Oh, and dbh() creates a separate DB connection for each thread. This is necessary, according to the PostgreSQL docs.
#!/usr/bin/env perl6
use DBIish;
use Log::Async;
my Lock $db-lock;
my Lock $deletion-lock;
my Lock $insertion-lock;
INIT {
logger.send-to($*ERR);
$db-lock .= new;
$deletion-lock .= new;
$insertion-lock .= new;
}
# Get a per-thread database connection.
sub dbh() {
state %connections;
my $dbh := %connections<$*THREAD.id>; # THIS IS WRONG. Should be %connections{$*THREAD.id}.
$db-lock.protect: {
if !$dbh.defined {
$dbh = DBIish.connect('Pg', :host<127.0.0.1>, :port(5432), :database<postgres>,
:user<postgres>, :password<PASSWORD>);
}
};
return $dbh;
}
sub create-table() {
my $name = 'enummappings';
my $column-spec =
'enumname TEXT NOT NULL, name TEXT NOT NULL, value INTEGER NOT NULL, UNIQUE(enumname, name)';
my $version = 1;
my $sth = dbh.prepare("CREATE TABLE IF NOT EXISTS $name ($column-spec);");
$sth.execute;
# And add the version number to a version table:
dbh.execute:
"CREATE TABLE IF NOT EXISTS tableversions (name TEXT NOT NULL UNIQUE, version INTEGER NOT NULL);";
$sth = dbh.prepare:
'INSERT INTO tableversions (name, version) VALUES (?, ?)
ON CONFLICT (name)
DO
UPDATE SET version = ?;';
$sth.execute($name, $version, $version);
}
sub add-enum-mappings($enumname, #names, #values --> Hash) {
$deletion-lock.protect: {
my $sth = dbh.prepare('DELETE FROM enummappings WHERE enumname = ?;');
$sth.execute($enumname);
};
my #rows = (^#names).map: -> $i {$enumname, #names[$i], #values[$i]};
info "Inserting #rows.elems() rows...";
$insertion-lock.protect: {
my $sth = dbh.prepare('INSERT INTO enummappings (enumname,name,value) VALUES '~
('(?,?,?)' xx #rows.elems).join(',') ~ ';');
$sth.execute(#rows>>.list.flat);
};
return %(status => 'okay');
}
# Create a bunch of long enums with random names, keys, and values.
sub create-enums(--> Hash[Hash]) {
my #letters = ('a'..'z', 'A'..'Z').flat;
my Hash %enums = ();
for ^36 {
my $key = #letters.pick(10).join;
for ^45 {
my $sub-key = #letters.pick(24).join;
%enums{$key}{$sub-key} = (0..10).pick;
}
}
return %enums;
}
sub MAIN() {
create-table;
await do for create-enums.kv -> $enum-name, %enum {
start {
add-enum-mappings($enum-name, %enum.keys, %enum.values);
CATCH { default { note "Got error adding enum: " ~ .gist; } }
};
}
}
I'm on Windows 10, with a 8-core computer. I know I could insert the data single-threadedly, but what if the game gets a hundred connections at once? I need to fix this for good.
I suspect your problem is here:
my $dbh := %connections<$*THREAD.id>;
The %hash<...> syntax is only for literals. You really need to write %connections{$*THREAD.id}.
With your error in place, you have just one DB connection that's shared between all threads, and I guess that's what DBIish (or the underlying postgresql C client library) is unhappy about.

Sensenet: Export Contents

I'm trying to export content from sensenet using (http://wiki.sensenet.com/Export#Configuration)
"export" command call:
Export.exe -SOURCE /Root/Sites/Test -TARGET C:\ExportSensenet -ASM ..\bin
I also tried without the "ASM" parameter.
Export did not complete successfully.
Export ends with error:
System.TypeInitializationException: The type initializer for 'SenseNet.ContentRe
pository.Storage.SR' threw an exception. ---> System.Reflection.ReflectionTypeLo
adException: Unable to load one or more of the requested types. Retrieve the Loa
derExceptions property for more information.
at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
at System.Reflection.Assembly.GetTypes()
at SenseNet.ContentRepository.Storage.TypeHandler.GetTypesByInterface(Type in
terfaceType) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\St
orage\TypeHandler.cs:line 209
at SenseNet.ContentRepository.Storage.SR..cctor() in c:\Builds\8\SenseNet\PAC
KAGECommunity\Sources\Source\SenseNet\Storage\SR.cs:line 22
--- End of inner exception stack trace ---
at SenseNet.ContentRepository.Storage.SR.get_ResourceManager()
at SenseNet.ContentRepository.Storage.Caching.Dependency.CacheDependencyFacto
ry.CreateNodeDataDependency(NodeData nodeData) in c:\Builds\8\SenseNet\PACKAGECo
mmunity\Sources\Source\SenseNet\Storage\Caching\CacheDependencyFactory.cs:line 7
5
at SenseNet.ContentRepository.Storage.DataBackingStore.CacheNodeData(NodeData
nodeData, String cacheKey) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Sou
rce\SenseNet\Storage\DataBackingStore.cs:line 325
at SenseNet.ContentRepository.Storage.DataBackingStore.GetNodeData(NodeHead h
ead, Int32 versionId) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\Se
nseNet\Storage\DataBackingStore.cs:line 212
at SenseNet.ContentRepository.Storage.Node.LoadNode(NodeHead head, VersionNum
ber version) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\St
orage\Node.cs:line 1644
at SenseNet.ContentRepository.User.get_Administrator() in c:\Builds\8\SenseNe
t\PACKAGECommunity\Sources\Source\SenseNet\ContentRepository\User.cs:line 38
at SenseNet.ContentRepository.Security.DesktopAccessProvider.get_CurrentUser(
) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\ContentReposi
tory\Security\DesktopAccessProvider.cs:line 36
at SenseNet.ContentRepository.Storage.Security.AccessProvider.ChangeToSystemA
ccount() in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\Storag
e\Security\AccessProvider.cs:line 72
at SenseNet.ContentRepository.Security.DesktopAccessProvider.GetCurrentUser()
in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\ContentReposit
ory\Security\DesktopAccessProvider.cs:line 52
at SenseNet.ContentRepository.Storage.Security.AccessProvider.ChangeToSystemA
ccount() in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\Storag
e\Security\AccessProvider.cs:line 72
at SenseNet.ContentRepository.RepositoryInstance.DoStart() in c:\Builds\8\Sen
seNet\PACKAGECommunity\Sources\Source\SenseNet\ContentRepository\RepositoryInsta
nce.cs:line 144
at SenseNet.ContentRepository.RepositoryInstance.Start(RepositoryStartSetting
s settings) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\Con
tentRepository\RepositoryInstance.cs:line 108
at SenseNet.ContentRepository.Repository.Start(RepositoryStartSettings settin
gs) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\ContentRepo
sitory\Repository.cs:line 58
at SenseNet.Tools.ContentExporter.Exporter.Main(String[] args) in c:\Builds\8
\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\Tools\Export\Exporter.cs:line
139
at SenseNet.ContentRepository.Storage.SR.get_ResourceManager()
at SenseNet.ContentRepository.Storage.Caching.Dependency.CacheDependencyFacto
ry.CreateNodeDataDependency(NodeData nodeData) in c:\Builds\8\SenseNet\PACKAGECo
mmunity\Sources\Source\SenseNet\Storage\Caching\CacheDependencyFactory.cs:line 7
5
at SenseNet.ContentRepository.Storage.DataBackingStore.CacheNodeData(NodeData
nodeData, String cacheKey) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Sou
rce\SenseNet\Storage\DataBackingStore.cs:line 325
at SenseNet.ContentRepository.Storage.DataBackingStore.GetNodeData(NodeHead h
ead, Int32 versionId) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\Se
nseNet\Storage\DataBackingStore.cs:line 212
at SenseNet.ContentRepository.Storage.Node.LoadNode(NodeHead head, VersionNum
ber version) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\St
orage\Node.cs:line 1644
at SenseNet.ContentRepository.User.get_Administrator() in c:\Builds\8\SenseNe
t\PACKAGECommunity\Sources\Source\SenseNet\ContentRepository\User.cs:line 38
at SenseNet.ContentRepository.Security.DesktopAccessProvider.get_CurrentUser(
) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\ContentReposi
tory\Security\DesktopAccessProvider.cs:line 36
at SenseNet.ContentRepository.Storage.Security.AccessProvider.ChangeToSystemA
ccount() in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\Storag
e\Security\AccessProvider.cs:line 72
at SenseNet.ContentRepository.Security.DesktopAccessProvider.GetCurrentUser()
in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\ContentReposit
ory\Security\DesktopAccessProvider.cs:line 52
at SenseNet.ContentRepository.Storage.Security.AccessProvider.ChangeToSystemA
ccount() in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\Storag
e\Security\AccessProvider.cs:line 72
at SenseNet.ContentRepository.RepositoryInstance.DoStart() in c:\Builds\8\Sen
seNet\PACKAGECommunity\Sources\Source\SenseNet\ContentRepository\RepositoryInsta
nce.cs:line 144
at SenseNet.ContentRepository.RepositoryInstance.Start(RepositoryStartSetting
s settings) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\Con
tentRepository\RepositoryInstance.cs:line 108
at SenseNet.ContentRepository.Repository.Start(RepositoryStartSettings settin
gs) in c:\Builds\8\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\ContentRepo
sitory\Repository.cs:line 58
at SenseNet.Tools.ContentExporter.Exporter.Main(String[] args) in c:\Builds\8
\SenseNet\PACKAGECommunity\Sources\Source\SenseNet\Tools\Export\Exporter.cs:line
139
I did not change the export.exe.config file and it has the right database configuration.
Usually this is a sign of a missing library. First I'd try to simply copy all the libraries from the web\bin folder to the web\Tools folder (where you execute the tool). If that does not help, pls make sure that the runtime bindings in the export config are the same as in the web.config.

Yii framework error - "failed to open stream: permission denied"

I have just started to use Yii framework on a windows 7 machine. It's giving me this annoying error and it goes away when I restart the computer.
Can anyone shed some light on what's happening and how to fix it?.. Thanks a bunch
Here is the error I get:
PHP warning
copy(C:\www\corp\assets\96296f5a\js\ckeditor\plugins\imagepaste2.3.zip): failed to open stream: Permission denied
C:\www\yii-1.1.13\framework\utils\CFileHelper.php(131)
119
120 $folder=opendir($src);
121 while(($file=readdir($folder))!==false)
122 {
123 if($file==='.' || $file==='..')
124 continue;
125 $path=$src.DIRECTORY_SEPARATOR.$file;
126 $isFile=is_file($path);
127 if(self::validatePath($base,$file,$isFile,$fileTypes,$exclude))
128 {
129 if($isFile)
130 {
131 copy($path,$dst.DIRECTORY_SEPARATOR.$file);
132 if(isset($options['newFileMode']))
133 chmod($dst.DIRECTORY_SEPARATOR.$file,$options['newFileMode']);
134 }
135 elseif($level)
136 self::copyDirectoryRecursive($path,$dst.DIRECTORY_SEPARATOR.$file,$base.'/'.$file,$fileTypes,$exclude,$level-1,$options);
137 }
138 }
139 closedir($folder);
140 }
141
142 /**
143 * Returns the files found under the specified directory and subdirectories.
Stack Trace
#0
+
C:\www\yii-1.1.13\framework\utils\CFileHelper.php(131): copy("C:\www\corp\protected\extensions\bootstrap\assets\js\ckeditor\pl...", "C:\www\corp\assets\96296f5a\js\ckeditor\plugins\imagepaste2.3.zi...")
#1
+
C:\www\yii-1.1.13\framework\utils\CFileHelper.php(136): CFileHelper::copyDirectoryRecursive("C:\www\corp\protected\extensions\bootstrap\assets\js\ckeditor\pl...", "C:\www\corp\assets\96296f5a\js\ckeditor\plugins", "/js/ckeditor/plugins", array(), ...)
#2
+
C:\www\yii-1.1.13\framework\utils\CFileHelper.php(136): CFileHelper::copyDirectoryRecursive("C:\www\corp\protected\extensions\bootstrap\assets\js\ckeditor", "C:\www\corp\assets\96296f5a\js\ckeditor", "/js/ckeditor", array(), ...)
#3
+
C:\www\yii-1.1.13\framework\utils\CFileHelper.php(136): CFileHelper::copyDirectoryRecursive("C:\www\corp\protected\extensions\bootstrap\assets\js", "C:\www\corp\assets\96296f5a\js", "/js", array(), ...)
#4
+
C:\www\yii-1.1.13\framework\utils\CFileHelper.php(63): CFileHelper::copyDirectoryRecursive("C:\www\corp\protected\extensions\bootstrap\assets", "C:\www\corp\assets\96296f5a", "", array(), ...)
#5
+
C:\www\yii-1.1.13\framework\web\CAssetManager.php(251): CFileHelper::copyDirectory("C:\www\corp\protected\extensions\bootstrap\assets", "C:\www\corp\assets\96296f5a", array("exclude" => array(".svn", ".gitignore"), "level" => -1, "newDirMode" => 511, "newFileMode" => 438))
#6
–
C:\www\corp\protected\extensions\bootstrap\components\Bootstrap.php(458): CAssetManager->publish("C:\www\corp\protected\extensions\bootstrap\assets", false, -1, true)
453 if (isset($this->_assetsUrl))
454 return $this->_assetsUrl;
455 else
456 {
457 $assetsPath = Yii::getPathOfAlias('bootstrap.assets');
458 $assetsUrl = Yii::app()->assetManager->publish($assetsPath, false, -1, YII_DEBUG);
459 return $this->_assetsUrl = $assetsUrl;
460 }
461 }
462
463 /**
#7
–
C:\www\corp\protected\extensions\bootstrap\components\Bootstrap.php(163): Bootstrap->getAssetsUrl()
158 * #param string $cssFile the css file name to register
159 * #param string $media the media that the CSS file should be applied to. If empty, it means all media types.
160 */
161 public function registerAssetCss($cssFile, $media = '')
162 {
163 Yii::app()->getClientScript()->registerCssFile($this->getAssetsUrl() . "/css/{$cssFile}", $media);
164 }
165
166 /**
167 * Registers the core JavaScript.
168 * #since 0.9.8
#8
–
C:\www\corp\protected\extensions\bootstrap\components\Bootstrap.php(124): Bootstrap->registerAssetCss("bootstrap.css")
119 /**
120 * Registers the Bootstrap CSS.
121 */
122 public function registerCoreCss()
123 {
124 $this->registerAssetCss('bootstrap' . (!YII_DEBUG ? '.min' : '') . '.css');
125 }
126
127 /**
128 * Registers the Bootstrap responsive CSS.
129 * #since 0.9.8
#9
+
C:\www\corp\protected\extensions\bootstrap\components\Bootstrap.php(102): Bootstrap->registerCoreCss()
#10
+
C:\www\yii-1.1.13\framework\base\CModule.php(387): Bootstrap->init()
#11
+
C:\www\yii-1.1.13\framework\base\CModule.php(523): CModule->getComponent("bootstrap")
#12
+
C:\www\yii-1.1.13\framework\base\CApplication.php(152): CModule->preloadComponents()
#13
+
C:\www\yii-1.1.13\framework\YiiBase.php(125): CApplication->__construct("C:\www\corp/protected/config/main.php")
#14
+
C:\www\yii-1.1.13\framework\YiiBase.php(98): YiiBase::createApplication("CWebApplication", "C:\www\corp/protected/config/main.php")
#15
+
C:\www\corp\index.php(13): YiiBase::createWebApplication("C:\www\corp/protected/config/main.php")
2013-02-25 11:29:18 Apache/2.2.22 (Win32) PHP/5.3.13 Yii Framework/1.1.13
The error basically says that YII is not able to copy the required assets from the extensions on to the assets directory at runtime.
The directory C:\www\corp where your YII project exists should be writable by the web server process.
I would see if there is there a firewall/anti-virus that might be blocking the web server from creating files. Try reading the web server log.