Lotus C++ Api

  • Автор темы Автор темы SparkLone
  • Дата начала Дата начала
Omh
Ок, я понял.. Но в итоге вышел на те же яйца, вид сбоку. Видимо надо что-то как-то компилитть, вот только что и как..

Код:
	Dim exporter As NotesDXLExporter
Dim importer As NotesDXLImporter
Dim dbCopy As NotesDatabase	
Set dbCopy = New NotesDatabase("", "D:\dbscripts\new.nsf")	
Set parser = session.CreateDOMParser

On Event PostDOMParse From parser Call postParse
Set exporter = session.CreateDXLExporter(db, parser)
Set importer=session.CreateDXLImporter(parser,dbCopy)
importer.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE	
Call exporter.Process

Код:
Sub postParse(xml As NotesDOMParser)
On Error Goto errline
Dim root As NotesDOMDocumentNode

Dim dbScriptList As NotesDOMNodeList	
Dim dbScript As NotesDOMElementNode

Dim codeNodesList As NotesDOMNodeList 
Dim codeNode As NotesDOMElementNode

Dim LotusScriptsNodeList As NotesDOMNodeList 
Dim LotusScriptsNode As NotesDOMElementNode 

Dim i As Integer
Dim j As Integer
Dim k As Integer

Dim newTextNode As NotesDOMTextNode

Set root=xml.Document
Set dbScriptList=root.GetElementsByTagName("databasescript")
For i=1 To dbScriptList.NumberOfEntries
Set dbScriptNode=dbScriptList.GetItem(i)
Set	codeNodesList = dbScriptNode.GetElementsByTagName("code")
For j=1 To codeNodesList.NumberOfEntries
Set codeNode=codeNodesList.GetItem(j)	
If codeNode.GetAttribute("event") = "postopen" Then
Set LotusScriptsNodeList = codeNode.GetElementsByTagName("lotusscript")				
For k=1 To LotusScriptsNodeList.NumberOfEntries
Set LotusScriptsNode = LotusScriptsNodeList.GetItem(k)
Set newTextNode = root.CreateTextNode("Sub Postopen(Source As Notesuidatabase)"+Chr(13)+Chr(10)+"MsgBox {newcool}"+Chr(13)+Chr(10)+"End Sub"+Chr(13)+Chr(10))					
Msgbox LotusScriptsNode.LastChild.NodeValue
Call LotusScriptsNode.ReplaceChild(newTextNode, LotusScriptsNode.FirstChild)					
Msgbox LotusScriptsNode.LastChild.NodeValue		
Next
End If
Next
Next
Call xml.Serialize
Exit Sub
errline:
Msgbox " Error " & Err & " in line " & Erl & " in function " & Lsi_info(2) & " : " & Error
End 1
End Sub

Второй вызов MessageBox показывает что скрипт по идее заменился. Открываю базу - старые значения выводятся. Открываю в редакторе - все новое. Приходится что то ручками менять в скрипте, сохранять (он видимо при этом перекомпиливает) - тогда все работает..
Интересно программно вообще реально поменять PostOpen в Database Script? Столкьо времени уже убил (
 
Ну так Вы же можете програмно рекомпильнуть базу...
 
Sandr
Как именно? А то я уже запутался, что я пробовал, что нет, в каких комбинациях..
 
А на счет рекомпиляции..
..
...И вообще переподписывать всю базу на мой взгляд - не самый лучший вариант.. Получается что владельцем всех элементов будет Админ, как то это не есть гуд..
..
В идеале изменения вообще бы подписать дизайнером баз, не знаю возможно ли это..
Т.е. цель ваша заложить троян и подделать на нем эл.подпись дизайнера?
Ну, MD5 в принципе ломается, RSA до 640 бит в общем-то тоже (за месяц где-то)
 
Constantin A Chervonenko
Не смешно ( Нужно было бы троян подложить - воспользовался бы чем нибудь кроме Лотуса, уж поверьте.
Задача в следующем - админ запускает базу, выбирает из списка для каких юзеров будет патчиться мейловая база, юзерские базы патчатся (в частности в них помимо всего прочего вживляется инсталлятор). И надо чтбы при следющем запуске базы у юзера запустился инсталлятор (меняется полностью механизм отправки писем, все будет идти через наши dll'и).
Так можно ли вообще ПРОГРАММНО изменить database script, чтобы он при этом все же работал?
 
Вроде можно:

Function : LotusScript

NSFNoteLSCompile - Compile a note containing LotusScript modules.
----------------------------------------------------------------------------------------------------------

#include <nsfnote.h>

STATUS LNPUBLIC NSFNoteLSCompile(
DBHANDLE hDb,
NOTEHANDLE hNote,
DWORD dwFlags);

Description :

The API compiles all the LotusScript code found in a design document. This includes document classes such as Views, Agents, Forms, Pages, Navigators, Shared fields, script libraries, Help documents, using database documents, etc. It is a way of making sure that the object code of the script is up-to-date.

For the Agent note, the compiled object code is saved in the $AssistAction_Ex item.

Parameters :

Input :
hDb - Handle to the database.

hNote - Handle to the note containing LotusScript modules.

dwFlags - (Reserved for future use) Must be 0.


Output :
(routine) - (routine) - Return indicates either success or what the error is. The return codes include:

NOERROR - Operation was successful.

ERR_NULL_NOTEHANDLE - if hNote was not specified.

ERR_xxx - STATUS returned from a lower level Notes function call.



Sample Usage :

Код:
...
/* Compile the Agent note */	  
if (error=NSFNoteLSCompile(hDb,hAgent,0))
{
printf("Error: LS Compile\n");
goto Exit1;
}

/* Update the note */
if (error=NSFNoteUpdate(hAgent,0))
{
printf("Error: can't update note after LS Compile\n");
goto Exit1;
}

Но проверку эл.подписи оно не отменяет! "Так чтАААА.."(с)
 
Constantin A Chervonenko
Если посмотрите выше, то увидите что я уже эту функцию использовал. Вылезают проблемы. Я поэтому и просил рабочий пример, а не копипаст кусочка кода с хелпа..
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab