NS_IMETHODIMP DonutDirectoryServiceProvider::GetFile(const char *prop, PRBool *persistent, nsIFile **_retval) { if (!strcmp(prop, NS_APP_USER_PROFILE_50_DIR) || !strcmp(prop, NS_APP_PROFILE_DIR_STARTUP)) { *persistent = PR_TRUE; nsCOMPtr<nsILocalFile> dir; NS_NewLocalFile(nsEmbedString(GetAppDataPath()), PR_FALSE, getter_AddRefs(dir)); dir->Append(NS_LITERAL_STRING("Donut")); PRBool exists; dir->Exists(&exists); if(!exists){ dir->Create(nsIFile::DIRECTORY_TYPE, 0664); } return dir->Clone(_retval); } return NS_ERROR_FAILURE; }
nsresult TestPermissions() { nsresult rv; // Return value // File variables HANDLE tempFileHandle; nsCOMPtr<nsILocalFile> tempFile; nsCOMPtr<nsILocalFile> tempDirectory1; nsCOMPtr<nsILocalFile> tempDirectory2; WCHAR filePath[MAX_PATH]; WCHAR dir1Path[MAX_PATH]; WCHAR dir2Path[MAX_PATH]; // Security variables DWORD result; PSID everyoneSID = NULL, adminSID = NULL; PACL dirACL = NULL, fileACL = NULL; PSECURITY_DESCRIPTOR dirSD = NULL, fileSD = NULL; EXPLICIT_ACCESS ea[2]; SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY; SECURITY_ATTRIBUTES sa; TRUSTEE everyoneTrustee; ACCESS_MASK everyoneRights; // Create a well-known SID for the Everyone group. if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &everyoneSID)) { fail("NTFS Permissions: AllocateAndInitializeSid Error"); return NS_ERROR_FAILURE; } // Create a SID for the Administrators group. if(! AllocateAndInitializeSid(&SIDAuthNT, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &adminSID)) { fail("NTFS Permissions: AllocateAndInitializeSid Error"); return NS_ERROR_FAILURE; } // Initialize an EXPLICIT_ACCESS structure for an ACE. // The ACE will allow Everyone read access to the directory. ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS)); ea[0].grfAccessPermissions = GENERIC_READ; ea[0].grfAccessMode = SET_ACCESS; ea[0].grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT; ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID; ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; ea[0].Trustee.ptstrName = (LPTSTR) everyoneSID; // Initialize an EXPLICIT_ACCESS structure for an ACE. // The ACE will allow the Administrators group full access ea[1].grfAccessPermissions = GENERIC_ALL | STANDARD_RIGHTS_ALL; ea[1].grfAccessMode = SET_ACCESS; ea[1].grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT; ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID; ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP; ea[1].Trustee.ptstrName = (LPTSTR) adminSID; // Create a new ACL that contains the new ACEs. result = SetEntriesInAcl(2, ea, NULL, &dirACL); if (ERROR_SUCCESS != result) { fail("NTFS Permissions: SetEntriesInAcl Error"); return NS_ERROR_FAILURE; } // Initialize a security descriptor. dirSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); if (NULL == dirSD) { fail("NTFS Permissions: LocalAlloc Error"); return NS_ERROR_FAILURE; } if (!InitializeSecurityDescriptor(dirSD, SECURITY_DESCRIPTOR_REVISION)) { fail("NTFS Permissions: InitializeSecurityDescriptor Error"); return NS_ERROR_FAILURE; } // Add the ACL to the security descriptor. if (!SetSecurityDescriptorDacl(dirSD, true, dirACL, false)) { fail("NTFS Permissions: SetSecurityDescriptorDacl Error"); return NS_ERROR_FAILURE; } // Initialize a security attributes structure. sa.nLength = sizeof (SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = dirSD; sa.bInheritHandle = false; // Create and open first temporary directory if(!CreateDirectoryW(L".\\NTFSPERMTEMP1", &sa)) { fail("NTFS Permissions: Creating Temporary Directory"); return NS_ERROR_FAILURE; } GetFullPathNameW((LPCWSTR)L".\\NTFSPERMTEMP1", MAX_PATH, dir1Path, NULL); rv = NS_NewLocalFile(nsEmbedString(dir1Path), false, getter_AddRefs(tempDirectory1)); if (NS_FAILED(rv)) { fail("NTFS Permissions: Opening Temporary Directory 1"); return rv; } // Create and open temporary file tempFileHandle = CreateFileW(L".\\NTFSPERMTEMP1\\NTFSPerm.tmp", GENERIC_READ | GENERIC_WRITE, 0, NULL, //default security CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(tempFileHandle == INVALID_HANDLE_VALUE) { fail("NTFS Permissions: Creating Temporary File"); return NS_ERROR_FAILURE; } CloseHandle(tempFileHandle); GetFullPathNameW((LPCWSTR)L".\\NTFSPERMTEMP1\\NTFSPerm.tmp", MAX_PATH, filePath, NULL); rv = NS_NewLocalFile(nsEmbedString(filePath), false, getter_AddRefs(tempFile)); if (NS_FAILED(rv)) { fail("NTFS Permissions: Opening Temporary File"); return rv; } // Update Everyone Explict_Acess to full access. ea[0].grfAccessPermissions = GENERIC_ALL | STANDARD_RIGHTS_ALL; // Update the ACL to contain the new ACEs. result = SetEntriesInAcl(2, ea, NULL, &dirACL); if (ERROR_SUCCESS != result) { fail("NTFS Permissions: SetEntriesInAcl 2 Error"); return NS_ERROR_FAILURE; } // Add the new ACL to the security descriptor. if (!SetSecurityDescriptorDacl(dirSD, true, dirACL, false)) { fail("NTFS Permissions: SetSecurityDescriptorDacl 2 Error"); return NS_ERROR_FAILURE; } // Create and open second temporary directory if(!CreateDirectoryW(L".\\NTFSPERMTEMP2", &sa)) { fail("NTFS Permissions: Creating Temporary Directory 2"); return NS_ERROR_FAILURE; } GetFullPathNameW((LPCWSTR)L".\\NTFSPERMTEMP2", MAX_PATH, dir2Path, NULL); rv = NS_NewLocalFile(nsEmbedString(dir2Path), false, getter_AddRefs(tempDirectory2)); if (NS_FAILED(rv)) { fail("NTFS Permissions: Opening Temporary Directory 2"); return rv; } // Move the file. rv = tempFile->MoveTo(tempDirectory2, EmptyString()); if (NS_FAILED(rv)) { fail("NTFS Permissions: Moving"); return rv; } // Access the ACL of the file result = GetNamedSecurityInfoW(L".\\NTFSPERMTEMP2\\NTFSPerm.tmp", SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, &fileACL, NULL, &fileSD); if (ERROR_SUCCESS != result) { fail("NTFS Permissions: GetNamedSecurityDescriptor Error"); return NS_ERROR_FAILURE; } // Build a trustee representing "Everyone" BuildTrusteeWithSid(&everyoneTrustee, everyoneSID); // Get Everyone's effective rights. result = GetEffectiveRightsFromAcl(fileACL, &everyoneTrustee, &everyoneRights); if (ERROR_SUCCESS != result) { fail("NTFS Permissions: GetEffectiveRightsFromAcl Error"); return NS_ERROR_FAILURE; } // Check for delete access, which we won't have unless permissions have // updated if((everyoneRights & DELETE) == (DELETE)) { passed("NTFS Permissions Test"); rv = NS_OK; } else { fail("NTFS Permissions: Access check."); rv = NS_ERROR_FAILURE; } // Cleanup if (everyoneSID) FreeSid(everyoneSID); if (adminSID) FreeSid(adminSID); if (dirACL) LocalFree(dirACL); if (dirSD) LocalFree(dirSD); if(fileACL) LocalFree(fileACL); tempDirectory1->Remove(true); tempDirectory2->Remove(true); return rv; }
nsresult TestWinAttribs() { if (!IsXPOrGreater()) return NS_OK; printf("Is XP or greater, running tests...\n"); nsresult rv; // File variables HANDLE hIndexed; nsCOMPtr<nsIFile> localFile; WCHAR filePath[MAX_PATH]; // Create and open temporary file hIndexed = CreateFileW(L".\\indexbit.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, //FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, not supported by cf NULL); if(hIndexed == INVALID_HANDLE_VALUE) { fail("Test Win Attribs: Creating Test File"); return NS_ERROR_FAILURE; } CloseHandle(hIndexed); GetFullPathNameW((LPCWSTR)L".\\indexbit.txt", MAX_PATH, filePath, NULL); //wprintf(filePath); //wprintf(L"\n"); rv = NS_NewLocalFile(nsEmbedString(filePath), false, getter_AddRefs(localFile)); if (NS_FAILED(rv)) { fail("Test Win Attribs: Opening Test File"); DeleteFileW(filePath); return rv; } nsCOMPtr<nsILocalFileWin> localFileWin(do_QueryInterface(localFile)); DWORD dwAttrs = GetFileAttributesW(filePath); if (dwAttrs == INVALID_FILE_ATTRIBUTES) { fail("Test Win Attribs: GetFileAttributesW - couldn't find our temp file."); DeleteFileW(filePath); return NS_ERROR_FAILURE; } dwAttrs |= FILE_ATTRIBUTE_NOT_CONTENT_INDEXED; SetFileAttributesW(filePath, dwAttrs); uint32_t attribs = 0; rv = localFileWin->GetFileAttributesWin(&attribs); if (NS_FAILED(rv)) { fail("Test Win Attribs: GetFileAttributesWin failed to GET attributes. (1)"); DeleteFileW(filePath); return NS_ERROR_FAILURE; } if (attribs & nsILocalFileWin::WFA_SEARCH_INDEXED) { fail("Test Win Attribs: GetFileAttributesWin attributed did not match. (2)"); DeleteFileW(filePath); return NS_ERROR_FAILURE; } dwAttrs &= ~FILE_ATTRIBUTE_NOT_CONTENT_INDEXED; SetFileAttributesW(filePath, dwAttrs); rv = localFileWin->GetFileAttributesWin(&attribs); if (NS_FAILED(rv)) { fail("Test Win Attribs: GetFileAttributesWin failed to GET attributes. (3)"); DeleteFileW(filePath); return NS_ERROR_FAILURE; } if (!(attribs & nsILocalFileWin::WFA_SEARCH_INDEXED)) { fail("Test Win Attribs: GetFileAttributesWin attributed did not match. (4)"); DeleteFileW(filePath); return NS_ERROR_FAILURE; } dwAttrs &= ~FILE_ATTRIBUTE_NOT_CONTENT_INDEXED; SetFileAttributesW(filePath, dwAttrs); attribs = nsILocalFileWin::WFA_SEARCH_INDEXED; rv = localFileWin->SetFileAttributesWin(attribs); dwAttrs = GetFileAttributesW(filePath); if (NS_FAILED(rv)) { fail("Test Win Attribs: GetFileAttributesWin failed to SET attributes. (5)"); DeleteFileW(filePath); return NS_ERROR_FAILURE; } if (dwAttrs & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) { fail("Test Win Attribs: SetFileAttributesWin attributed did not match. (6)"); DeleteFileW(filePath); return NS_ERROR_FAILURE; } dwAttrs |= FILE_ATTRIBUTE_NOT_CONTENT_INDEXED; SetFileAttributesW(filePath, dwAttrs); attribs = 0; rv = localFileWin->SetFileAttributesWin(attribs); dwAttrs = GetFileAttributesW(filePath); if (NS_FAILED(rv)) { fail("Test Win Attribs: GetFileAttributesWin failed to SET attributes. (7)"); DeleteFileW(filePath); return NS_ERROR_FAILURE; } if (!(dwAttrs & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)) { fail("Test Win Attribs: SetFileAttributesWin attributed did not match. (8)"); DeleteFileW(filePath); return NS_ERROR_FAILURE; } DeleteFileW(filePath); passed("Test Win Attribs: passed tests."); return NS_OK; }
int StartXPCOM(){ nsresult rv = NS_ERROR_BASE; const GREVersionRange vr = { "1.9.2", PR_TRUE, "2.0", PR_FALSE }; char xpcomPath[_MAX_PATH]; rv = GRE_GetGREPathWithProperties(&vr, 1, nsnull, 0, xpcomPath, sizeof(xpcomPath)); if (NS_FAILED(rv)){ char *fxXpcomPath = "C:\\Program Files\\Mozilla Firefox\\xpcom.dll"; if(::PathFileExistsA( fxXpcomPath )){ strcpy(xpcomPath, fxXpcomPath); rv = NS_OK; }else{ rv = NS_ERROR_BASE; } } if (NS_FAILED(rv)) return 1; char *lastslash = ns_strrpbrk(xpcomPath, "/\\"); if (!lastslash) return 2; rv = XPCOMGlueStartup(xpcomPath); if (NS_FAILED(rv)) return 3; *lastslash = '\0'; char xulPath[_MAX_PATH]; _snprintf(xulPath, sizeof(xulPath), "%s\\xul.dll", xpcomPath); xulPath[sizeof(xulPath) - 1] = '\0'; HINSTANCE xulModule = LoadLibraryEx(CString(xulPath), NULL, 0); if (!xulModule) return 4; TCHAR temp[_MAX_PATH]; GetModuleFileName(xulModule, temp, sizeof(temp)); XRE_InitEmbedding = (XRE_InitEmbeddingType) GetProcAddress(xulModule, "XRE_InitEmbedding"); if (!XRE_InitEmbedding) { //fprintf(stderr, "Error: %i\n", GetLastError()); return 5; } XRE_TermEmbedding = (XRE_TermEmbeddingType) GetProcAddress(xulModule, "XRE_TermEmbedding"); if (!XRE_TermEmbedding) { fprintf(stderr, "Error: %i\n", GetLastError()); return 5; } XRE_NotifyProfile = (XRE_NotifyProfileType) GetProcAddress(xulModule, "XRE_NotifyProfile"); if (!XRE_NotifyProfile) { fprintf(stderr, "Error: %i\n", GetLastError()); return 5; } // Scope all the XPCOM stuff { nsCOMPtr<nsILocalFile> xuldir; rv = NS_NewNativeLocalFile(nsCString(xpcomPath), PR_FALSE, getter_AddRefs(xuldir)); if (NS_FAILED(rv)) return 6; TCHAR self[_MAX_PATH]; HINSTANCE hInstanceApp = NULL; hInstanceApp = GetModuleHandle(NULL); GetModuleFileName(hInstanceApp, self, sizeof(self)); lastslash = ns_strrpbrk(xpcomPath, "/\\"); if (!lastslash) return 7; *lastslash = '\0'; nsCOMPtr<nsILocalFile> appdir; nsEmbedCString cself; NS_UTF16ToCString(nsEmbedString(self), NS_CSTRING_ENCODING_UTF8, cself); rv = NS_NewNativeLocalFile(cself, PR_FALSE, getter_AddRefs(appdir)); if (NS_FAILED(rv)) return 8; kDirSvcProvider = new DonutDirectoryServiceProvider(); kDirSvcProvider->AddRef(); rv = XRE_InitEmbedding(xuldir, appdir, kDirSvcProvider, nsnull, 0); if (NS_FAILED(rv)) return 9; XRE_NotifyProfile(); RegisterAdditionalComponents(); } return rv; }