|
Преведено от Светослав Генов (me) !
Оригинал: sojge@docs.uu.se Клиент-към-клиент протокола (CTCP) *13* Този клиент-към-клиент протокол е създаден да се използва при следните две ситуации: 1/ главно за изпращане на структурирани данни (като графики гласова и различни информации за фонта) между потребителските клиенти, и по-точно 2/ да се пусне заявка към потребителският клиент и да се получи отговор. От сега, само прост метод за текстово криптиране се използва в първата категория, и няколко двойки заявки/отговори в категория 2. Тази статия ще бъде концентриране главно върху последната категория. ********************************************* ОСНОВНИЯ ПРОТОКОЛ МЕЖДУ КЛИЕНТИТЕ И СЪРВЪРИТЕ ********************************************* Символите между клиента и сървъра са 8-бита байтове (познати още като октети) и имат numeric стойности от осмично 0 до осмично 0337 (което включва в себе си от 0 до 255 десетичните числа). Някои символи са специални. CHARS ::= '�00' .. '377' /* Символи */ NUL ::= '�00' /* Нула */ NL ::= 'n' /* Нов ред */ CR ::= 'r' /* Керидж ретурн лайн */ Линия пратена към сървъра, или получена от сървъра (тук наречена "съобщение от ниско ниво") се състои или от 0 или от няколко октета (като не се вземат предвид NUL, NL, и CR) с или NL или CR в края. L-CHARS ::= '�01' .. '�11' | '�13' | '�14' | '�16' .. '377' L-LINE ::= L-CHARS* CR LF NUL никога не се праща до сървър. ********************************************** ПОСТАВЯНЕ НА КАВИЧКИ В СЪОБЩЕНИЯ ОТ НИСКО НИВО ********************************************** Тей като съобщеният от и към сървърите не могат да съдържат NUL, NL и CR, но все още може да бъде желано да се праща ВСЕКИ символ (в така наречените "съобщения от средно ниво") между клиентите, тези три символа трябва да бъдат поставени в кавички. Затова се използват специален символ като кавичка, кавичката трябва също да бъде поставена в кавичка. M-QUOTE ::= '�20' (т.е. CNTRL/P). /* КОНТРОЛ+P */ Когато пращате съобщение от средно ниво, ако се намери един символ от тези - NUL, NL, CR или M-QUOTE, този символ ще бъде заменен с двусимволна серия според следната таблица. NUL --> M-QUOTE '0' NL --> M-QUOTE 'n' CR --> M-QUOTE 'r' M-QUOTE --> M-QUOTE M-QUOTE Когато получите съобщение от ниско ниво и видите M-QUOTE, вижте следващият символ и ги заменете водейки се от таблицата, за да получите съответно съобщение от средно ниво). M-QUOTE '0' --> NUL M-QUOTE 'n' --> NL M-QUOTE 'r' --> CR M-QUOTE M-QUOTE --> M-QUOTE Ако символът след M-QUOTE не е някой от описаните символите в таблицата, това е грепка, затова махнете M-QUOTE символа от съобщението, по избор можете да съобщите това на потребителя. Например стринг 'x' M-QUOTE 'y' 'z' >от сървъра се преобразува по следния начин 'x 'y' 'z'. Преди поставянето на кавички в съобщения от ниско ниво, съобщение към сървъра (и в обратната посока: след като махате кавичките от съобщението от ниско ниво, което съобщение идва от сървъра) изглежда така M-LINE ::= CHARS* ****************** ЗАКЛЮЧИТЕЛНИ ДАННИ ****************** За изпращането както на обширни данни така и на двойка заявка/отговор межди клиентите, форматът на разширенети данни е нужен. Разширените данни се пращат в текстовата част на съобщението от средно ниво (след поставянето на кавички в съобщения от ниски нива, както и в текстовата част на съобщенията от ниски нива). За да пратите разширени данни във текст, трябва по някакъв начин да ги разделим. Това се прави като разширените данни се обградят с разделящ символ. X-DELIM ::= '�01' Като се има предвид, че както началният символ за обграждане така и последния символ за обграждане са едни и същи, всеки втори X-DELIM се нарича четен, а всеки първи нечетен. Всеки първи X-DELIM в съобщението е нечетен. Когато се слагат кавички (и обратно, преди да се махнат кавичките) всеки един брой от символи независимо от кой вид, изключение прави X-DELIM, може да се използва в разширените данни, например, между X-DELIM двойка. X-CHR ::= '�00' | '�02' .. '377' Разширените съобщение или е празно (нищо между четният и нечетният разделител), има едно или много символи, които не са празни места (например, всеки символ, но не и '�40'), или един или много символи, които не са празни места, които са последвани от празно място, последвано от нула или много символи. X-N-AS ::= '�00' | '�02' .. '�37' | '�41' .. '377' SPC ::= '�40' X-MSG ::= | X-N-AS+ | X-N-AS+ SPC X-CHR* Първите символи до първият SPC (или ако няма SPC, цялото X-MSG) се наричат заключителни за разширеното съобщение. Заключението се използва, за да се разбере какъв тип от разширени данни е бил използван. Заключинието може да бъде *всеки* стринг от символи, и даже и те да са букви, ще има разлика между големите и малките букви, затова големите и малките бикви имат значение. Разширените данни са валидни само в командите PRIVMSG и NOTICE. Ако разширените данни са отговор на заявка, се изпраща NOTICE, в противен случай се използва PRIVMSG. Както PRIVMSG, така и NOTICE към потребител и към канал може да съдържа разширени данни. Текстовите части от PRIVMSG и NOTICE може да съдържат нула или няколко разширени съобщения, смесени с нула или няколко големи количества от не-разширени данни. ********************************************* Поставяне на кавички в съобщения от CTCP ниво ********************************************* За да пратите разделителя X-DELIM между съобщения с разширени данни, трябва да бъде поставен в кавички. Това въвежда друг символ като кавичка (който се различава от символите използвани за кавички в съобщеният с ниско ниво, дотолкова че той няма нужда да бъде в кавички). X-QUOTE ::= '134' (т.е., наклонена черта). Когато слагате кавички от ниво CTCP, само истинското CTCP съобщение (т.е. разширените данни, заявките, отговорите) се поставят в специалният символ. Това позволява на потребителя да прати X-QUOTE символите, когато иска. Следните преводи трябва да се използват: X-DELIM --> X-QUOTE 'a' X-QUOTE --> X-QUOTE X-QUOTE и когато се прави обработването на вече получено съобщение от ниво CTCP, само CTCP съобщението ще се обработи, където ще се използва следната таблица: X-QUOTE 'a' --> X-DELIM X-QUOTE X-QUOTE --> X-QUOTE Ако X-QUOTE се види с друг символ различен от тези по-горе, това е грешка и X-QUOTE символа трябва да бъде премахнат. Т.е. CTCP стрингът 'x' X-QUOTE 'y' 'z' ще се преобразува в трисимволен стринг 'x' 'y' 'z'. Ако X-DELIM е намерен извън CTCP съобщение, съобщението ще съдържа X-DELIM. (Това трябва да се случи само с последния X-DELIM, когато има четен брой X-DELIM в съобщение от средно ниво.) ******************************* Примери за поставяне на кавички ******************************* Има три основни нива на съобщения. Най-високото ниво (H) е текстът при нивото потребител-към-клиент. Средното ниво (M) е ниво, при което CTCP поставянето в кавички се прави към съобщението от ниво H. Най-ниското ниво (L) е нивото клиент-към-сървър., където се прави поставяне на кавички от нисо ниво към съобщение от ниво M. Следните взаимоотношения са истински, с lowQuote(message) като функция правеща поставяне на кавички от ниско ниво, lowDequote(message) махане на кавичките от ниско ниво, ctcpQuote(message) поставяне на кавички от ниво CTCP, ctcpDequote(message) махане на кавичките от ниво CTCP, и ctcpExtract(message) махане на всички CTCP съобщения от съобщението. Оператора || разделя различните серии. L = lowQuote(M) M = ctcpDequote(L) M = ctcpQuote(H) H = ctcpDequote(ctcpExtract(M)) Когато пращате CTCP съобщение заедно с нормален текст M = ctcpQuote(H1) || '�01' || ctcpQuote(X) || '�01' || ctcpQuote(H2) Разбира се, може да има нула или повече нормални съобщения и нула или повече CTCP съобщения смесено. - --- Пример 1 ----------------------------------------------------------------- Потребителя (наречен адресат) иска да прати стринга Hi there!nHow are you? към потребителя цел, т.е., съобщение, в което потребителя е въвел нов ред (как е направено това, ако е направено изобщо, се различава от клиент до клиент), ще се види вътрешно от клиента в следната командата PRIVMSG victim :Hi there!nHow are you? K? което ще се постави в кавички от ниво CTCP така PRIVMSG victim :Hi there!nHow are you? \K? което на свой ред ще се превърне в съобщение поставено в кавички от ниско ниво PRIVMSG victim :Hi there!�20nHow are you? \K? и ще се прати към сървъра като преди това се постави нов ред в края. Това ще се яви на потребителя цел така :actor PRIVMSG victim :Hi there!�20nHow are you? \K? (където \K ще изглежда подобно на OK в SIS D47 et al), което след всички махания на кавички от ниско ниво ще стане така :actor PRIVMSG victim :Hi there!nHow are you? \K? и след махане на кавичките от ниво CTCP :actom PRIVMSG victim :Hi there!nHow are you? K? Как това ще бъде показано зависи от клиент до клиент, но се предполага, че ще има нов ред между думите "there" и "How". - --- Пример 2 ----------------------------------------------------------------- Ако клиента на адресата иска да прати стринг "Emacs wins," това може да се преобразува като стринг "ntbig�20�01�00\:", когато се криптира чрез SED, използвайки някакъв ключ, така клиентът започва с поставяне на кавички от ниво CTCP на стринга и го прави на "ntbig�20\a�00\\:" и построява командата от M-ниво PRIVMSG victim :�01SED ntbig�20\a�00\\:�01 което след поставяна на кавички от ниско ниво се преобразува в PRIVMSG victim :�01SED �20ntbig�20�20\a�200\\:�01 което ще се прати към сървъра, с нов ред в края. От другата страна, стрингът :actor PRIVMSG victim :�01SED �20ntbig�20�20\a�200\\:�01 ще бъде получен от сървъра и кавичките от ниско ниво ще бъдат махнати и стринга ще се преобразува в :actor PRIVMSG victim :�01SED ntbig�20\a�00\\:�01 след което на стринга "ntbig�20\a�00\\:" ще бъдат махнати кавичките от ниво CTCP до "ntbig�20�01�00\:" и чак след това ще има SED декодиране, което ще върне "Emacs wins", ако се използва правилния ключ. - --- Пример 3 ----------------------------------------------------------------- Ако адресата иска да прати заявка USERINFO към потребителя цел, и е по средата на разговор, клиентът може да реши прекрепи USERINFO молбата ктм нормалното текстово съобщение. Тогава клиентът иска прати текстовото съобщение "Say hi to Ronnt/actor" и CTCP заявката "USERINFO" към целта. PRIVMSG victim :Say hi to Ronnt/actor плюс USERINFO което след слагане на кавички от ниво CTCP става PRIVMSG victim :Say hi to Ronnt/actor плюс USERINFO което се слепва в PRIVMSG victim :Say hi to Ronnt/actor�01USERINFO�01 и след слагане на кавички от ниско ниво PRIVMSG victim :Say hi to Ron�20nt/actor�01USERINFO�01 се праща към сървъра. От другата страна, съобщението :actor PRIVMSG victim :Say hi to Ron�20nt/actor�01USERINFO�01 пристига. При него се махат кавичките от ниско ниво :actor PRIVMSG victim :Say hi to Ronnt/actor�01USERINFO�01 и след това се разделя на :actor PRIVMSG victim :Say hi to Ronnt/actor плюс USERINFO След махането на кавичките от ниво CTCP и в двете съобщение, съобщението :actor PRiVMSG victim :Say hi to Ronnt/actor се появява, докато на CTCP командата USERINFO се отговаря. Отговорът може да бъде USERINFO :CS studentn�01test�01 на което ще се сложат кавички от ниво CTCP USERINFO :CS studentn\atest\a и ще се прати NOTICE, тей като това е отговор: NOTICE actor :�01USERINFO :CS studentn\atest\a�01 и ще се сложат кавички от ниско ниво, NOTICE actor :�01USERINFO :CS student�20n\atest\a�01 след което се праща към сървъра на потребителя цел. Когато се появи на адресата, на съобщението :victim NOTICE actor :�01USERINFO :CS student�20n\atest\a�01 се махат кавичките от ниско ниво :victim NOTICE actor :�01USERINFO :CS studentn\atest\a�01 До сега, всички CTCP отговори се разделят, давайки 1 CTCP отговор и нормален NOTICE USERINFO :CS studentn\atest\a На оставащият отговор му се махат кавичките от ниво CTCP USERINFO :CS studentn�01test�01 и се показва на адресата. ***************************** Познати двойки ЗАЯВКА/ОТГОВОР ***************************** Двойката заявка/отговор се праща между двата клиента в две фази. Първата е да се прати заявката. Това става с "privmsg" командата (или към канал, или към псевдоним -- няма значение). Втората фаза е пращането на отговор. Това става с "notice" командата. Ето ги и познатите двойки, които могат да се използват. CLIENTINFO - Dynamic master index of what a client knows ERRMSG - Used when an error needs to be replied with FINGER - Mainly used to get a users idle time USERINFO - A string set by the user (never client coder) VERSION - The version and type of the client FINGER Това се използва, за да се вземе локална информация от системата на потребителя за него и също така idle времето му. Заявката в "privmsg" командата трябва да изглежда така �01FINGER�01 докато отговора се праща чрез "notice" и изглежда така �01FINGER :#�01 където # съдържа информация за за истинското име на потребителя, логин името на клиентската машина и idle времето, и е в тип X-N-AS. VERSION Това се използва, за да се вземе информацията за името на клиента и неговата версия. Молбата се праща чрез "privmsg" и е много лесна. �01VERSION�01 Отговорът е: �01VERSION #:#:#�01 Където # съдържа името на клиента, второто # съдържа версията на клиента, а третото
Използваме X-N-CLN ::= '�00' .. '�71' | '�73' .. '377' Името на клиента е стринг от тип X-N-CLN казвайки неща като "Kiwi" или "ircII", версията е нещо като "5.2" или "2.1.5c", а платформата е нещо като "GNU Emacs 18.57.19 under SunOS 4.1.1 on Sun SLC" или "Compiled with gcc -ansi under Ultrix 4.0 on VAX-11/730". SOURCE Това се използва, за да се вземе информация, от къде да се може да се смъкне клиента. Заявката се праща чрез "privmsg" командата �01SOURCE�01 а отговорът е нула или няколко CTCP отговора във формата �01SOURCE #:#:#�01 последвано от маркировка за край �01SOURCE�01 където първото # е името на Интернет хоста, където клиентът може да бъде взет чрез anonymous FTP, второто # е името на директорията, а третото # списък, разделен с празни места, оказващ файловете на клиента в тази директория. Използваме X-N-SPC ::= '�00' .. '�37' | '�41' .. '377' името на FTP сайта трябва да е нещо като "cs.bu.edu" или "funic.funet.fi". Полето с името на файла е незадължително директория последвана от едно или няколко имена на файлове. Ако се зададе само името на директорията всички файлове в директорията трбва да бъдет копиране, когато се взема сурса клиента. Ако някакви файлове са зададени, само тези файлове в директорията трябва да бъдат копирани. Забележете, че така определеното позволява всякакви символи, но не и празни места, това включва разбира се и :. Примери са "pub/emacs/irc/", за да се вземат всички файлове е директорията pub/emacs/irc/, клиентът трябва да може първо да се логне чрез потребител "ftp" и след това да даде командата "CD pub/emacs/irc/", последвана от командата "mget *". (Трябва да се вземе предвид и binary и да се изпълно този промт). Друг пример е "/pub/irc Kiwi.5.2.el.Z", в който трябва да се изпълни "CD /pub/irc" и "get Kiwi.5.2.el.Z". USERINFO Това се използва, за да се предаде стринг, който може да бъде сложен от потребителя, но никога не трябва да бъде сложен от клиента. Заявката е проста �01USERINFO�01 с отговор �01USERINFO :#�01 където # е стойността на стринг, който потребителят е сложил. CLIENTINFO Това е за разработчиците на клиента, за да им е по-лесно за покажат на другите хакери на клиенти, какво знае дадения клиент, когато стане въпрос за CTCP. Отговорите трябва да бъдат сравнително verbose, обяснявайки, кои CTCP командите са познати, какви аргументи от какъв тип са очаквани, и какви отговори могат да бъдат очаквани от клиента. Заявката е думата CLIENTINFO изпратен чрез "privmsg" незадължително последвана от двоеточие и една или повече определящи думи разделени с празно място, където думата CLIENTINFO �01CLIENTINFO�01 трябва да бъде отговорена със списък съдържащ заключителни данни (вижте по-горе секцията ЗАКЛЮЧИТЕЛНИ ДАННИ). С един аргумент, отговорът трябва да е описание, как да се използва тази заключителна дума; с два аргумента, как да се използват тези два аргумента и т.н. ERRMSG Това се използва като отговор, когато се засече непозната заявка. Също така, когато се използва като заявка, отговорът трябва да върне текста в заявката, заедно с индикираща дума, която да каже, че не е станала никаква грешка. Трябва да се използва следната форма на заявката �01ERRMSG #�01 където # е стринг, съдържат всеки символи, с отговора �01ERRMSG # :#�01 където първото # е същият този стринг в заявката, а второто # е кратко съобщение, съобщаващо на потребителя, че няма грешка. Нормален ERRMSG отговор, може да бъре пратен, когато се види грешна заявка или някои фалшиви обширни данни, и изглежда така �01ERRMSG # :#�01 където първото #, е несполучилата заявка или фалшивите обширни данни, а второто # е текст, обясняващ, какъв е проблема, като "unknown query" или "failed decrypting text". ******* Примери ******* Пращайки PRIVMSG victim :�01FINGER�01 може да получите :victim NOTICE actor :�01FINGER :Please check my USERINFO instead :Klaus Zeuge (sojge@mizar) 1 second has passed since victim gave a command last.�01 (това е само една линия) или защо пък не :victim NOTICE actor :�01FINGER :Please check my USERINFO instead :Klaus Zeuge (sojge@mizar) 427 seconds (7 minutes and 7 seconds) have passed since victim gave a command last.�01 ако Klaus Zeuge се окаже мързеливичък? ![]() Пращайки PRIVMSG victim : може да получите :victim NOTICE actor : an argument to CLIENTINFO.< Пращайки PRIVMSG victim : може да получите :victim NOTICE actor : argument, a description of the client query keyword is returned.< макар че ако пратите PRIVMSG victim : вероятно ще получите нещо като :victim NOTICE actor : тей като "clientinfo" не е познат. Пращайки PRIVMSG victim : може да получите :victim NOTICE actor : it works like an echo.< Пращайки PRIVMSG victim :�01USERINFO�01 може да получите нещо патетично дълго :victim NOTICE actor : important matter on IRC and I speak fluent swedish, decentgerman, and some english.< Пращайки PRIVMSG victim :�01VERSION�01 може да получите :victim NOTICE actor :�01VERSION Kiwi:5.2:GNU Emacs 18.57.19 under SunOS 4.1.1 on Sun SLC:FTP.Lysator.LiU.SE:/pub/emacs Kiwi-5.2.el.Z Kiwi.README�01 ако клиентът е с име Kiwi и е версия 5.2 и той се използва под GNU Emacs 18.57.19 пуснат на Sun SLCwith SunOS 4.1.1. Клиентът може да бъде намерен на FTP сървърът FTP.Lysator.LiU.SE, след като се логнете можете да дадете FTP командата "cd /pub/emacs/". След това трябва да вземете файла Kiwi-5.2.el.Z и Kiwi.README; предполага се, че един от тези файлове ви казва как да процедирата при инсталирането на клиента, след като сте взели файловете. Преведено от Светослав Генов (me) !
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||









