<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=3260980</guid>
        <pubDate>Sun, 13 Jan 2013 22:10:06 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=3260980</link>
        <description><![CDATA[AK666: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=130425&view=findpost&p=3260971'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>RuSA &#064; <time class="tag-quote__quoted-time" datetime="2013-01-14T01:00:32+04:00">13.01.13, 21:00</time></span><div class='quote '>выкладываю модуль шифрования и небольшое тестовое приложение</div></div><br>
СПАСИБО огороменное&#33;<br>
<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=130425&view=findpost&p=3260971'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>RuSA &#064; <time class="tag-quote__quoted-time" datetime="2013-01-13T21:00:32+00:00">13.01.13, 21:00</time></span><div class='quote '>Однако, давно это было - почти пять лет как )</div></div><br>
и тем не менее....]]></description>
        <author>AK666</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=3260971</guid>
        <pubDate>Sun, 13 Jan 2013 21:00:32 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=3260971</link>
        <description><![CDATA[RuSA: По просьбе AK666 выкладываю модуль шифрования и небольшое тестовое приложение.<br>
<span class="b-attach" data-size="62792" data-hits="155" data-attach-id="26358" data-attach-post-id="3260971">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3260971&amp;attach_id=26358' title='Скачать файл' target='_blank'>crypts.zip</a> (, : 155)
		</span> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2013-01-13T21:01:20+00:00">13.01.13, 21:01</time></span></span><br>
Однако, давно это было - почти пять лет как )]]></description>
        <author>RuSA</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=995013</guid>
        <pubDate>Tue, 24 Jan 2006 15:53:28 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=995013</link>
        <description><![CDATA[RuSA: Упс.<br>А может быть у тебя нет также и функции ap_MD5Encode?<br>Чтобы это сразу проверить можешь просто временно закоментировать строку с ap_to64.<br>P.S. А у тебя есть ICQ? Если есть стучи мне на мой. В привате выслал.]]></description>
        <author>RuSA</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=995000</guid>
        <pubDate>Tue, 24 Jan 2006 15:45:18 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=995000</link>
        <description><![CDATA[nekto550: Точно я ошибся. Исправил. Теперь другое<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;ap_to64( @salt, trunc(random), 8);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
[Ошибка] Unit69.pas(211): Undeclared identifier: &#39;ap_to64&#39;<br>
<br>
Странно.... Как её задекларировать?]]></description>
        <author>nekto550</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=994980</guid>
        <pubDate>Tue, 24 Jan 2006 15:27:13 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=994980</link>
        <description><![CDATA[RuSA: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=130425&view=findpost&p=994966'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nekto550 &#064; <time class="tag-quote__quoted-time" datetime="2006-01-24T15:15:02+00:00">24.01.06, 15:15</time></span><div class='quote '>У меня компилятор вышибает от<br>
type<br>
   TMD5_PswBuffer = array [0..511] of char;<br>
</div></div><br>
  А что за ошибка?<br>
<br>
  Это правильный код и если вышибает, значит скорее всего вставлено куда-то не туда.]]></description>
        <author>RuSA</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=994966</guid>
        <pubDate>Tue, 24 Jan 2006 15:15:02 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=994966</link>
        <description><![CDATA[nekto550: Привет&#33; Большое спасибо, но не работает... У меня компилятор вышибает от<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; TMD5_PswBuffer = array [0..511] of char;</div></ol></div></div></div></div><br>
и если не трудно посмотри этот мой топик. <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=130234' target='_blank'>Проблемы с кодировкой</a>]]></description>
        <author>nekto550</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=993711</guid>
        <pubDate>Mon, 23 Jan 2006 12:48:09 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=993711</link>
        <description><![CDATA[RuSA: Тогда уж обе процы - шифровка и проверка.<br>
И, видимо, тебе удобнее если типы string вместо PChar.<br>
Примерно так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">//==========================================================</div><div class="code_line">// определения из MD5</div><div class="code_line">//==========================================================</div><div class="code_line">(*</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp; // &quot;магическая&quot; строка MD5 (метка о &quot;зашифрованности&quot;)</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;&nbsp; AP_MD5PW_ID = &#39;$apr1$&#39;;</div><div class="code_line">&nbsp;&nbsp; AP_MD5PW_IDLEN = 6;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure ap_MD5Encode( password, hash, res: PChar; szRes: integer );</div><div class="code_line">procedure ap_to64( lpS: PChar; v: DWORD; n: integer );</div><div class="code_line">*)</div><div class="code_line">&nbsp;</div><div class="code_line">//==========================================================</div><div class="code_line">// &quot;тутошние&quot; определения</div><div class="code_line">//==========================================================</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp; // 512 - размер шифрованной строки, зависит от &quot;длины ключа&quot;</div><div class="code_line">&nbsp;&nbsp; // здесь взят для примера, в Си он был всего 120;</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;&nbsp; TMD5_PswBuffer = array [0..511] of char;</div><div class="code_line">&nbsp;</div><div class="code_line">//==========================================================</div><div class="code_line">// MD5_Encode</div><div class="code_line">//==========================================================</div><div class="code_line">(*</div><div class="code_line">&nbsp;MD5_Encode: выполнить MD5-шифрование для пользователя sUser с паролем</div><div class="code_line">&nbsp;sPsw и получить строку sCoded вида:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;&#60;Пользователь&#62;:&#60;Зашифрованная часть&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;Таблица соответствий для Си варианта:</div><div class="code_line">&nbsp;&nbsp; static int mkrecord(char *user, char *record, size_t rlen, char *sPasswd, int alg)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;-------------------------------------</div><div class="code_line">&nbsp;&nbsp; Си &nbsp; &nbsp; &nbsp; Здесь</div><div class="code_line">&nbsp;-------------------------------------</div><div class="code_line">&nbsp;&nbsp; user &nbsp; &nbsp; sUser</div><div class="code_line">&nbsp;&nbsp; record &nbsp; sCoded</div><div class="code_line">&nbsp;&nbsp; rlen &nbsp; &nbsp; убран</div><div class="code_line">&nbsp;&nbsp; passwd &nbsp; sPasswd</div><div class="code_line">&nbsp;&nbsp; alg &nbsp; &nbsp; &nbsp;убран, всегда MD5</div><div class="code_line">&nbsp;-------------------------------------</div><div class="code_line">*)</div><div class="code_line">procedure MD5_Encode( const sUser, sPasswd: AnsiString; var sCoded: AnsiString );</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; salt: array[0..8] of char;</div><div class="code_line">&nbsp;&nbsp; cpw: TMD5_PswBuffer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; // randomize; - каждый раз вызывать не требуется, надо вызвать только</div><div class="code_line">&nbsp;&nbsp; // один раз в начале выполнения программы или в FormCreate;</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // ap_to64: функция из заголовков Apach;</div><div class="code_line">&nbsp;&nbsp; // возвращает хеш - строковое представление длиной 8 символов случайного числа rand();</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;&nbsp; ap_to64( @salt, trunc(random), 8);</div><div class="code_line">&nbsp;&nbsp; salt[8] := #0; // получение Ascii-z строки - добавление последнего нолика-конца строки</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // ap_MD5Encode: шифрует пароль pw, используя хеш-строку salt;</div><div class="code_line">&nbsp;&nbsp; // возвращает строку в cpw - это зашифрованный пароль и его надо использовать,</div><div class="code_line">&nbsp;&nbsp; // его-то и записываем потом в файл ключей, чтобы с ним (зашифрованным) сравнивать</div><div class="code_line">&nbsp;&nbsp; // проверяемый пароль для доступа (потом);</div><div class="code_line">&nbsp;&nbsp; // salt: хеш для генерации пароля;</div><div class="code_line">&nbsp;&nbsp; // здесь pw: незашифрованный пароль из командной строки, если он в ней задан,</div><div class="code_line">&nbsp;&nbsp; // либо непросредственно введеный с клавиатуры (см. немного выше &quot;ap_getpass(... pwin)&quot;);</div><div class="code_line">&nbsp;&nbsp; // После выполнения cpw, насколько я понял, будет содержать в начале &quot;магическую&quot; строку:</div><div class="code_line">&nbsp;&nbsp; // &nbsp; &nbsp;AP_MD5PW_ID = &quot;$apr1$&quot;,</div><div class="code_line">&nbsp;&nbsp; // а уже после нее сам входной хеш (salt) и сгенерированное шифрованное значение.</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;&nbsp; ap_MD5Encode( PChar(sPasswd), salt, cpw, sizeof(cpw));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // получение строки: &#60;ползователь&#62;:&#60;зашифрованная часть&#62;</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;&nbsp; sCoded := sUser + &#39;:&#39; + cpw;</div><div class="code_line">end; // MD5_Encode</div><div class="code_line">&nbsp;</div><div class="code_line">//==========================================================</div><div class="code_line">// MD5_PSW_Validate</div><div class="code_line">//==========================================================</div><div class="code_line">(*</div><div class="code_line">&nbsp;MD5_PSW_Validate: проверить соответствие пароля sChkPsw хешу sUserHash.</div><div class="code_line">&nbsp;Шифрование MD5.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;Хеш sUserHash должен быть уже &quot;зашифрован&quot; и имеет вид:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&#60;ползователь&#62;:&#60;зашифрованная часть&#62;, т.е. полученный функцией MD5_Encode</div><div class="code_line">&nbsp;либо только &#60;зашифрованная часть&#62;.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;Вернет True если пароль верен и False иначе.</div><div class="code_line">*)</div><div class="code_line">function MD5_PSW_Validate( sChkPsw, sUserHash: AnsiString) : boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; sample: TMD5_PswBuffer;</div><div class="code_line">&nbsp;&nbsp; i: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; Result := False;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // выделим их строки sUserHash только зашифрованную часть...</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;&nbsp; i:= Pos( &#39;:&#39;, sUserHash );</div><div class="code_line">&nbsp;&nbsp; if i &#60;&#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// уберем имя пользователя - нам не требуется (!), имеет</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// значение только пароль.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;system.delete( sUserhash, 1, i ); // убрать все от начала до двоеточия (вкл его)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // если хеш строка не начинается с &quot;магической&quot; - неверно</div><div class="code_line">&nbsp;&nbsp; if StrLComp( PChar(sUserHash), AP_MD5PW_ID, AP_MD5PW_IDLEN) &#60;&#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{неверно, хеш не зашифрован} Exit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // выполняем MD5-шифрование входного пароля</div><div class="code_line">&nbsp;&nbsp; ap_MD5Encode( PChar(sChkPsw), PChar(sUserHash), {out}sample, sizeof(sample));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // если строки совпадают -&#62; OK</div><div class="code_line">&nbsp;&nbsp; Result := StrComp( sample, PChar(sUserHash) ) = 0;</div><div class="code_line">end; // MD5_PSW_Validate</div><div class="code_line">&nbsp;</div><div class="code_line">// пример работы:</div><div class="code_line">procedure Form1.FormCreate( Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; randomize;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; {... другой код...}</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// проверка пароля / получение пароля</div><div class="code_line">// в реальной проге будет две процедуры - одна создает, другая проверяет;</div><div class="code_line">// </div><div class="code_line">procedure Form1.BtnCheckPassword( Sender: TObject);</div><div class="code_line">var sRes: AnsiString; // зашифрованная строка</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; // I) получить готовую MD5-строку ключа для пользователя</div><div class="code_line">&nbsp;&nbsp; // с именем &quot;user&quot; и паролем &quot;куКиШ&quot;</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;&nbsp; MD5_Encode( &#39;user&#39;, &#39;куКиШ&#39;, sRes );</div><div class="code_line">&nbsp;&nbsp; { здесь sRes имеет вид: &#60;имя пользователя&#62;:&#60;шифр&#62; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // ... что-то еще ...</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // II) проверить подходит ли пароль &#39;Test&#39; для строки sRes</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;&nbsp; if not MD5_PSW_Validate( &#39;Test&#39;, sRes) then</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Raise Exception.Create( &#39;Неверный пароль&#39; )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ShowMessage(&#39;Неверный пароль&#39; )</div><div class="code_line">&nbsp;&nbsp; end else</div><div class="code_line">&nbsp;&nbsp; begin // подходит</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ShowMessage(&#39;Доступ разрешен&#39; )</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>RuSA</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=993648</guid>
        <pubDate>Mon, 23 Jan 2006 11:44:21 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=993648</link>
        <description><![CDATA[nekto550: Спасибо большое. Я наверное полностью обнаглел , но это вызвано моим незнанием.... Можно попросить немного переделать <br>Чтобы вызывалась функция в неё из переменной 1 поступал логин а из переменной 2 пароль а она в переменную 3 выкидывала готовое (логин:шифрпароль)<br><br>Слабоват я в программировании]]></description>
        <author>nekto550</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=993639</guid>
        <pubDate>Mon, 23 Jan 2006 11:34:48 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=993639</link>
        <description><![CDATA[RuSA: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=130425&view=findpost&p=992061'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nekto550 &#064; <time class="tag-quote__quoted-time" datetime="2006-01-21T18:19:22+00:00">21.01.06, 18:19</time></span><div class='quote '><br>
Нужная мне обработка похоже тут: ALG_APMD5...<br>
</div></div><br>
Все верно, именно там пес и зарыт.<br>
Вот перевод этой части:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; {case} ALG_APMD5: </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// (void) srand((int) time((time_t *) NULL));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// srand - инициализация генератора псевдослучайных чисел: аналог на Паскале randomize;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// time &nbsp;- возвращает текущее время;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;randomize;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// ap_to64: функция из заголовков Apach;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// возвращает хеш - строковое представление длиной 8 символов случайного числа rand();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ap_to64(&amp;salt[0], rand(), 8);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;salt[8] = &#39;{text}&#39;; // получение Ascii-z строки - добавление последнего нолика-конца строки</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// ap_MD5Encode: шифрует пароль pw, используя хеш-строку salt;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// возвращает строку в cpw - это зашифрованный пароль и его надо использовать,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// его-то и записываем потом в файл ключей, чтобы с ним (зашифрованным) сравнивать</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// проверяемый пароль для доступа (потом);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// salt: хеш для генерации пароля;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// здесь pw: незашифрованный пароль из командной строки, если он в ней задан,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// либо непросредственно введеный с клавиатуры (см. немного выше &quot;ap_getpass(... pwin)&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// После выполнения cpw, насколько я понял, будет содержать в начале &quot;магическую&quot; строку:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// &nbsp; &nbsp;AP_MD5PW_ID = &quot;$apr1$&quot;, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// а уже после нее сам входной хеш (salt) и сгенерированное шифрованное значение.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Это сделано для того, чтобы можно было в качестве salt подставлять либо исходный</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// хеш, либо уже зашифрованный пароль (к котором тоже будет хеш);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ap_MD5Encode((const unsigned char *)pw, (const unsigned char *)salt,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cpw, sizeof(cpw));</div></ol></div></div></div></div><br>
<br>
Далее смотри место после конструкции &quot;case&quot;:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;// блок &quot;REC&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(record, user);</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcat(record, &quot;:&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcat(record, cpw);</div></ol></div></div></div></div><br>
<br>
здесь в record cформируется строка вида: &lt;нешифрованное имя пользователя&gt;:&lt;шифрованный пароль&gt;.<br>
<br>
Для проверки пароля надо вызвать ap_MD5Encode еще раз.<br>
<br>
Я посмотрел в inet, нашел прогу сравнения на Си. <br>
Пощажу тему :) и приведу только перевод на &quot;человечий&quot; язык Delphi:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">//==========================================================</div><div class="code_line">// определения из MD5</div><div class="code_line">//==========================================================</div><div class="code_line">(*</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp; // &quot;магическая&quot; строка MD5 (метка о &quot;зашифрованности&quot;)</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;&nbsp; AP_MD5PW_ID = &#39;$apr1$&#39;;</div><div class="code_line">&nbsp;&nbsp; AP_MD5PW_IDLEN = 6;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure ap_MD5Encode( password, hash, res: PChar; nbytes: integer );</div><div class="code_line">&nbsp;</div><div class="code_line">*)</div><div class="code_line">&nbsp;</div><div class="code_line">//==========================================================</div><div class="code_line">// MD5_PSW_Validate</div><div class="code_line">//==========================================================</div><div class="code_line">(*</div><div class="code_line">&nbsp;MD5_PSW_Validate: проверить соответствие пароля ChkPsw хешу hash.</div><div class="code_line">&nbsp;Шифрование MD5.</div><div class="code_line">&nbsp;Хеш hash должен быть уже &quot;зашифрован&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;Вернет True если пароль верен и False иначе.</div><div class="code_line">*)</div><div class="code_line">&nbsp;</div><div class="code_line">function MD5_PSW_Validate( ChkPsw, hash: PChar ) : boolean;</div><div class="code_line">var </div><div class="code_line">&nbsp;&nbsp; // 512 - размер шифрованной строки, зависит от &quot;длины ключа&quot;</div><div class="code_line">&nbsp;&nbsp; // здесь взят для примера, в Си он быд всего 120;</div><div class="code_line">&nbsp;&nbsp; //</div><div class="code_line">&nbsp;&nbsp; sample: array [0..511] of char;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; Result := False;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // если хеш строка не начинается с &quot;магической&quot; - неверно</div><div class="code_line">&nbsp;&nbsp; if StrLComp( hash, AP_MD5PW_ID, AP_MD5PW_IDLEN) &#60;&#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{неверно, хеш не зашифрован} Exit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // выполняем MD5-шифрование пароля</div><div class="code_line">&nbsp;&nbsp; &nbsp; ap_MD5Encode( ChkPsw, hash, sample, sizeof(sample));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // если строки совпадают -&#62; OK</div><div class="code_line">&nbsp;&nbsp; Result := StrComp( sample, hash ) = 0;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
  При проверке надо иметь в виду, что hash на входе должен содержать только шифро-часть той строки, которая возвращаена в record&#39;е<br>
(метка &#39;блок &quot;REC&quot;&#39;). Т.е. после двоеточия.<br>
<br>
Надеюсь понятно.<br>
Если что - спрашивай.]]></description>
        <author>RuSA</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=993397</guid>
        <pubDate>Mon, 23 Jan 2006 09:10:44 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=993397</link>
        <description><![CDATA[nekto550: Спасибо. ЖДУ&#33;&#33;&#33;]]></description>
        <author>nekto550</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=993378</guid>
        <pubDate>Mon, 23 Jan 2006 08:57:02 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=993378</link>
        <description><![CDATA[RuSA: Посмотрю сегодня (23.01.06).<br>Все таки оригинальнй был &quot;Турбо Паскаль&quot;, очень на Си смахивал ;)]]></description>
        <author>RuSA</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=992061</guid>
        <pubDate>Sat, 21 Jan 2006 18:19:22 +0000</pubDate>
        <title>Проблема с генератором htpasswd</title>
        <link>https://forum.sources.ru/index.php?showtopic=130425&amp;view=findpost&amp;p=992061</link>
        <description><![CDATA[nekto550: <strong class='tag-b'>RuSA</strong> у меня проблема&#33;&#33;&#33; Делаю программу генератор htpasswd Мне дали исходник программы на турбо паскале.... Там есть MD5 шифрование Моя беда я нипонимаю что с чем шифруется какой ключ и.т.д.  MD5 взял из faq тут.  Понимаешь мне  отчано надо перенести это шифрование логина и пароля на делфи..........<br>
<br>
Вот об этой программе http://www.1gb.ru/default.aspx?ti=6&hti=12<br>
<br>
Нужная мне обработка похоже тут<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;case ALG_APMD5: </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;(void) srand((int) time((time_t *) NULL));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ap_to64(&amp;salt[0], rand(), 8);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;salt[8] = &#39;{text}&#39;;</div></ol></div></div></div></div><br>
<br>
Но я не знаю как её использовать... я не понимаю какие части логина и пароля шифруются.... и какой ключ...<br>
<br>
<br>
<br>
Вот полный исходник программы... на турбо паскале...<br>
<br>
Посмотри пожалуйста.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">/* ====================================================================</div><div class="code_line">&nbsp;* The Apache Software License, Version 1.1</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Copyright (c) 2000-2002 The Apache Software Foundation. &nbsp;All rights</div><div class="code_line">&nbsp;* reserved.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Redistribution and use in source and binary forms, with or without</div><div class="code_line">&nbsp;* modification, are permitted provided that the following conditions</div><div class="code_line">&nbsp;* are met:</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* 1. Redistributions of source code must retain the above copyright</div><div class="code_line">&nbsp;* &nbsp; &nbsp;notice, this list of conditions and the following disclaimer.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* 2. Redistributions in binary form must reproduce the above copyright</div><div class="code_line">&nbsp;* &nbsp; &nbsp;notice, this list of conditions and the following disclaimer in</div><div class="code_line">&nbsp;* &nbsp; &nbsp;the documentation and/or other materials provided with the</div><div class="code_line">&nbsp;* &nbsp; &nbsp;distribution.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* 3. The end-user documentation included with the redistribution,</div><div class="code_line">&nbsp;* &nbsp; &nbsp;if any, must include the following acknowledgment:</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &quot;This product includes software developed by the</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp;Apache Software Foundation (http://www.apache.org/).&quot;</div><div class="code_line">&nbsp;* &nbsp; &nbsp;Alternately, this acknowledgment may appear in the software itself,</div><div class="code_line">&nbsp;* &nbsp; &nbsp;if and wherever such third-party acknowledgments normally appear.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* 4. The names &quot;Apache&quot; and &quot;Apache Software Foundation&quot; must</div><div class="code_line">&nbsp;* &nbsp; &nbsp;not be used to endorse or promote products derived from this</div><div class="code_line">&nbsp;* &nbsp; &nbsp;software without prior written permission. For written</div><div class="code_line">&nbsp;* &nbsp; &nbsp;permission, please contact apache@apache.org.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* 5. Products derived from this software may not be called &quot;Apache&quot;,</div><div class="code_line">&nbsp;* &nbsp; &nbsp;nor may &quot;Apache&quot; appear in their name, without prior written</div><div class="code_line">&nbsp;* &nbsp; &nbsp;permission of the Apache Software Foundation.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* THIS SOFTWARE IS PROVIDED ``AS IS&#39;&#39; AND ANY EXPRESSED OR IMPLIED</div><div class="code_line">&nbsp;* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class="code_line">&nbsp;* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</div><div class="code_line">&nbsp;* DISCLAIMED. &nbsp;IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR</div><div class="code_line">&nbsp;* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</div><div class="code_line">&nbsp;* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</div><div class="code_line">&nbsp;* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF</div><div class="code_line">&nbsp;* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND</div><div class="code_line">&nbsp;* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,</div><div class="code_line">&nbsp;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT</div><div class="code_line">&nbsp;* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</div><div class="code_line">&nbsp;* SUCH DAMAGE.</div><div class="code_line">&nbsp;* ====================================================================</div><div class="code_line">&nbsp;* ====================================================================</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* This software consists of voluntary contributions made by many</div><div class="code_line">&nbsp;* individuals on behalf of the Apache Software Foundation. &nbsp;For more</div><div class="code_line">&nbsp;* information on the Apache Software Foundation, please see</div><div class="code_line">&nbsp;* &#60;http://www.apache.org/&#62;.</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Portions of this software are based upon public domain software</div><div class="code_line">&nbsp;* originally written at the National Center for Supercomputing Applications,</div><div class="code_line">&nbsp;* University of Illinois, Urbana-Champaign.</div><div class="code_line">&nbsp;*/</div><div class="code_line">&nbsp;</div><div class="code_line">/******************************************************************************</div><div class="code_line">&nbsp;******************************************************************************</div><div class="code_line">&nbsp;* NOTE! This program is not safe as a setuid executable! &nbsp;Do not make it</div><div class="code_line">&nbsp;* setuid!</div><div class="code_line">&nbsp;******************************************************************************</div><div class="code_line">&nbsp;*****************************************************************************/</div><div class="code_line">/*</div><div class="code_line">&nbsp;* htpasswd.c: simple program for manipulating password file for</div><div class="code_line">&nbsp;* the Apache HTTP server</div><div class="code_line">&nbsp;* </div><div class="code_line">&nbsp;* Originally by Rob McCool</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* Exit values:</div><div class="code_line">&nbsp;* &nbsp;0: Success</div><div class="code_line">&nbsp;* &nbsp;1: Failure; file access/permission problem</div><div class="code_line">&nbsp;* &nbsp;2: Failure; command line syntax problem (usage message issued)</div><div class="code_line">&nbsp;* &nbsp;3: Failure; password verification failure</div><div class="code_line">&nbsp;* &nbsp;4: Failure; operation interrupted (such as with CTRL/C)</div><div class="code_line">&nbsp;* &nbsp;5: Failure; buffer would overflow (username, filename, or computed</div><div class="code_line">&nbsp;* &nbsp; &nbsp; record too long)</div><div class="code_line">&nbsp;* &nbsp;6: Failure; username contains illegal or reserved characters</div><div class="code_line">&nbsp;*/</div><div class="code_line">&nbsp;</div><div class="code_line">#include &quot;ap_config.h&quot;</div><div class="code_line">#ifndef NETWARE</div><div class="code_line">#include &#60;sys/types.h&#62;</div><div class="code_line">#endif</div><div class="code_line">#include &#60;signal.h&#62;</div><div class="code_line">#include &#60;errno.h&#62;</div><div class="code_line">#include &quot;ap.h&quot;</div><div class="code_line">#include &quot;ap_md5.h&quot;</div><div class="code_line">#include &quot;ap_sha1.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef HAVE_CRYPT_H</div><div class="code_line">#include &#60;crypt.h&#62;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef WIN32</div><div class="code_line">#include &#60;conio.h&#62;</div><div class="code_line">#include &quot;../os/win32/getopt.h&quot;</div><div class="code_line">#define unlink _unlink</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#ifndef CHARSET_EBCDIC</div><div class="code_line">#define LF 10</div><div class="code_line">#define CR 13</div><div class="code_line">#else /*CHARSET_EBCDIC*/</div><div class="code_line">#define LF &#39;\n&#39;</div><div class="code_line">#define CR &#39;\r&#39;</div><div class="code_line">#endif /*CHARSET_EBCDIC*/</div><div class="code_line">&nbsp;</div><div class="code_line">#define MAX_STRING_LEN 256</div><div class="code_line">#define ALG_PLAIN 0</div><div class="code_line">#define ALG_CRYPT 1</div><div class="code_line">#define ALG_APMD5 2</div><div class="code_line">#define ALG_APSHA 3 </div><div class="code_line">&nbsp;</div><div class="code_line">#define ERR_FILEPERM 1</div><div class="code_line">#define ERR_SYNTAX 2</div><div class="code_line">#define ERR_PWMISMATCH 3</div><div class="code_line">#define ERR_INTERRUPTED 4</div><div class="code_line">#define ERR_OVERFLOW 5</div><div class="code_line">#define ERR_BADUSER 6</div><div class="code_line">&nbsp;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* This needs to be declared statically so the signal handler can</div><div class="code_line">&nbsp;* access it.</div><div class="code_line">&nbsp;*/</div><div class="code_line">static char *tempfilename;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* If our platform knows about the tmpnam() external buffer size, create</div><div class="code_line">&nbsp;* a buffer to pass in. &nbsp;This is needed in a threaded environment, or</div><div class="code_line">&nbsp;* one that thinks it is (like HP-UX).</div><div class="code_line">&nbsp;*/</div><div class="code_line">#ifdef L_tmpnam</div><div class="code_line">static char tname_buf[L_tmpnam];</div><div class="code_line">#else</div><div class="code_line">static char *tname_buf = NULL;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Get a line of input from the user, not including any terminating</div><div class="code_line">&nbsp;* newline.</div><div class="code_line">&nbsp;*/</div><div class="code_line">static int getline(char *s, int n, FILE *f)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;register int i = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (1) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;s[i] = (char) fgetc(f);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (s[i] == CR) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;s[i] = fgetc(f);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((s[i] == 0x4) || (s[i] == LF) || (i == (n - 1))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;s[i] = &#39;{text}&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return (feof(f) ? 1 : 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;++i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">static void putline(FILE *f, char *l)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int x;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (x = 0; l[x]; x++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fputc(l[x], f);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;fputc(&#39;\n&#39;, f);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Make a password record from the given information. &nbsp;A zero return</div><div class="code_line">&nbsp;* indicates success; failure means that the output buffer contains an</div><div class="code_line">&nbsp;* error message instead.</div><div class="code_line">&nbsp;*/</div><div class="code_line">static int mkrecord(char *user, char *record, size_t rlen, char *passwd,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int alg)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;char *pw;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char cpw[120];</div><div class="code_line">&nbsp;&nbsp; &nbsp;char pwin[MAX_STRING_LEN];</div><div class="code_line">&nbsp;&nbsp; &nbsp;char pwv[MAX_STRING_LEN];</div><div class="code_line">&nbsp;&nbsp; &nbsp;char salt[9];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (passwd != NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;pw = passwd;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else {</div><div class="code_line">#ifdef TPF</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;Invalid entry. The -b option is required on TPF.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return usage();</div><div class="code_line">#else</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (ap_getpass(&quot;New password: &quot;, pwin, sizeof(pwin)) != 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ap_snprintf(record, (rlen - 1), &quot;password too long (&#62;%lu)&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(unsigned long) (sizeof(pwin) - 1));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return ERR_OVERFLOW;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;ap_getpass(&quot;Re-type new password: &quot;, pwv, sizeof(pwv));</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (strcmp(pwin, pwv) != 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ap_cpystrn(record, &quot;password verification error&quot;, (rlen - 1));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return ERR_PWMISMATCH;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;pw = pwin;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memset(pwv, &#39;{text}&#39;, sizeof(pwin));</div><div class="code_line">#endif /* TPF */</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;switch (alg) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;case ALG_APSHA:</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* XXX cpw &#62;= 28 + strlen(sha1) chars - fixed len SHA */</div><div class="code_line">&nbsp;&nbsp; &nbsp;ap_sha1_base64(pw,strlen(pw),cpw);</div><div class="code_line">&nbsp;&nbsp; &nbsp;break;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;case ALG_APMD5: </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;(void) srand((int) time((time_t *) NULL));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ap_to64(&amp;salt[0], rand(), 8);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;salt[8] = &#39;{text}&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ap_MD5Encode((const unsigned char *)pw, (const unsigned char *)salt,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cpw, sizeof(cpw));</div><div class="code_line">&nbsp;&nbsp; &nbsp;break;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;case ALG_PLAIN:</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* XXX this len limitation is not in sync with any HTTPd len. */</div><div class="code_line">&nbsp;&nbsp; &nbsp;ap_cpystrn(cpw,pw,sizeof(cpw));</div><div class="code_line">&nbsp;&nbsp; &nbsp;break;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;case ALG_CRYPT:</div><div class="code_line">&nbsp;&nbsp; &nbsp;default:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;(void) srand((int) time((time_t *) NULL));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ap_to64(&amp;salt[0], rand(), 8);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;salt[8] = &#39;{text}&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ap_cpystrn(cpw, (char *)crypt(pw, salt), sizeof(cpw) - 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;memset(pw, &#39;{text}&#39;, strlen(pw));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Check to see if the buffer is large enough to hold the username,</div><div class="code_line">&nbsp;&nbsp; &nbsp; * hash, and delimiters.</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((strlen(user) + 1 + strlen(cpw)) &#62; (rlen - 1)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;ap_cpystrn(record, &quot;resultant record too long&quot;, (rlen - 1));</div><div class="code_line">&nbsp;&nbsp; &nbsp;return ERR_OVERFLOW;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(record, user);</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcat(record, &quot;:&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcat(record, cpw);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">static int usage(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;Usage:\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;\thtpasswd [-cmdps] passwordfile username\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;\thtpasswd -b[cmdps] passwordfile username password\n\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;\thtpasswd -n[mdps] username\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;\thtpasswd -nb[mdps] username password\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot; -c &nbsp;Create a new file.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot; -n &nbsp;Don&#39;t update file; display results on stdout.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot; -m &nbsp;Force MD5 encryption of the password&quot;</div><div class="code_line">#if defined(WIN32) || defined(TPF) || defined(NETWARE)</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot; (default)&quot;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot; -d &nbsp;Force CRYPT encryption of the password&quot;</div><div class="code_line">#if (!(defined(WIN32) || defined(TPF) || defined(NETWARE)))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&quot; (default)&quot;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&quot;.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot; -p &nbsp;Do not encrypt the password (plaintext).\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot; -s &nbsp;Force SHA encryption of the password.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot; -b &nbsp;Use the password from the command line rather &quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&quot;than prompting for it.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&quot;On Windows, TPF and NetWare systems the &#39;-m&#39; flag is used by default.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&quot;On all other systems, the &#39;-p&#39; flag will probably not work.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return ERR_SYNTAX;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">static void interrupted(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;Interrupted.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (tempfilename != NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;unlink(tempfilename);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit(ERR_INTERRUPTED);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Check to see if the specified file can be opened for the given</div><div class="code_line">&nbsp;* access.</div><div class="code_line">&nbsp;*/</div><div class="code_line">static int accessible(char *fname, char *mode)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;FILE *s;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;s = fopen(fname, mode);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (s == NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;fclose(s);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 1;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Return true if a file is readable.</div><div class="code_line">&nbsp;*/</div><div class="code_line">static int readable(char *fname)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return accessible(fname, &quot;r&quot;);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Return true if the specified file can be opened for write access.</div><div class="code_line">&nbsp;*/</div><div class="code_line">static int writable(char *fname)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return accessible(fname, &quot;a&quot;);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Return true if the named file exists, regardless of permissions.</div><div class="code_line">&nbsp;*/</div><div class="code_line">static int exists(char *fname)</div><div class="code_line">{</div><div class="code_line">#ifdef WIN32</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct _stat sbuf;</div><div class="code_line">#else</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct stat sbuf;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;&nbsp; &nbsp;int check;</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef WIN32</div><div class="code_line">&nbsp;&nbsp; &nbsp;check = _stat(fname, &amp;sbuf);</div><div class="code_line">#else</div><div class="code_line">&nbsp;&nbsp; &nbsp;check = stat(fname, &amp;sbuf);</div><div class="code_line">#endif</div><div class="code_line">&nbsp;&nbsp; &nbsp;return ((check == -1) &amp;&amp; (errno == ENOENT)) ? 0 : 1;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Copy from the current position of one file to the current position</div><div class="code_line">&nbsp;* of another.</div><div class="code_line">&nbsp;*/</div><div class="code_line">static void copy_file(FILE *target, FILE *source)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;static char line[MAX_STRING_LEN];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (fgets(line, sizeof(line), source) != NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fputs(line, target);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* Let&#39;s do it. &nbsp;We end up doing a lot of file opening and closing,</div><div class="code_line">&nbsp;* but what do we care? &nbsp;This application isn&#39;t run constantly.</div><div class="code_line">&nbsp;*/</div><div class="code_line">int main(int argc, char *argv[])</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;FILE *ftemp = NULL;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FILE *fpw = NULL;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char user[MAX_STRING_LEN];</div><div class="code_line">&nbsp;&nbsp; &nbsp;char password[MAX_STRING_LEN];</div><div class="code_line">&nbsp;&nbsp; &nbsp;char record[MAX_STRING_LEN];</div><div class="code_line">&nbsp;&nbsp; &nbsp;char line[MAX_STRING_LEN];</div><div class="code_line">&nbsp;&nbsp; &nbsp;char pwfilename[MAX_STRING_LEN];</div><div class="code_line">&nbsp;&nbsp; &nbsp;char *arg;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int found = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int alg = ALG_CRYPT;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int newfile = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int nofile = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int noninteractive = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int args_left = 2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;tempfilename = NULL;</div><div class="code_line">&nbsp;&nbsp; &nbsp;signal(SIGINT, (void (*)(int)) interrupted);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Preliminary check to make sure they provided at least</div><div class="code_line">&nbsp;&nbsp; &nbsp; * three arguments, we&#39;ll do better argument checking as </div><div class="code_line">&nbsp;&nbsp; &nbsp; * we parse the command line.</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (argc &#60; 3) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return usage();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Go through the argument list and pick out any options. &nbsp;They</div><div class="code_line">&nbsp;&nbsp; &nbsp; * have to precede any other arguments.</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (i = 1; i &#60; argc; i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;arg = argv[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (*arg != &#39;-&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (*++arg != &#39;{text}&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (*arg == &#39;c&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;newfile++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else if (*arg == &#39;n&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;nofile++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;args_left--;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else if (*arg == &#39;m&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;alg = ALG_APMD5;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else if (*arg == &#39;s&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;alg = ALG_APSHA;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else if (*arg == &#39;p&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;alg = ALG_PLAIN;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else if (*arg == &#39;d&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;alg = ALG_CRYPT;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else if (*arg == &#39;b&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;noninteractive++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;args_left++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return usage();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Make sure we still have exactly the right number of arguments left</div><div class="code_line">&nbsp;&nbsp; &nbsp; * (the filename, the username, and possibly the password if -b was</div><div class="code_line">&nbsp;&nbsp; &nbsp; * specified).</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((argc - i) != args_left) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return usage();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">#ifdef NETWARE</div><div class="code_line">&nbsp;&nbsp; &nbsp;UnAugmentAsterisk(TRUE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetCurrentNameSpace(NW_NS_LONG);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetTargetNameSpace(NW_NS_LONG);</div><div class="code_line">#endif</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (newfile &amp;&amp; nofile) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;%s: -c and -n options conflict\n&quot;, argv[0]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return ERR_SYNTAX;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (nofile) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;i--;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else {</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (strlen(argv[i]) &#62; (sizeof(pwfilename) - 1)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;%s: filename too long\n&quot;, argv[0]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return ERR_OVERFLOW;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(pwfilename, argv[i]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (strlen(argv[i + 1]) &#62; (sizeof(user) - 1)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;%s: username too long (&#62;%lu)\n&quot;, argv[0],</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(unsigned long)(sizeof(user) - 1));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return ERR_OVERFLOW;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(user, argv[i + 1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((arg = strchr(user, &#39;:&#39;)) != NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;%s: username contains illegal character &#39;%c&#39;\n&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;argv[0], *arg);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return ERR_BADUSER;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (noninteractive) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (strlen(argv[i + 2]) &#62; (sizeof(password) - 1)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;%s: password too long (&#62;%lu)\n&quot;, argv[0],</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(unsigned long)(sizeof(password) - 1));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return ERR_OVERFLOW;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(password, argv[i + 2]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef WIN32</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (alg == ALG_CRYPT) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;alg = ALG_APMD5;</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;Automatically using MD5 format on Windows.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">#elif defined(TPF) || defined(NETWARE)</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (alg == ALG_CRYPT) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;alg = ALG_APMD5;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;Automatically using MD5 format.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; }</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#if (!(defined(WIN32) || defined(TPF) || defined(NETWARE)))</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (alg == ALG_PLAIN) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr,&quot;Warning: storing passwords as plain text might &quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&quot;just not work on this platform.\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">#endif</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (! nofile) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Only do the file checks if we&#39;re supposed to frob it.</div><div class="code_line">&nbsp;&nbsp; &nbsp; *</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Verify that the file exists if -c was omitted. &nbsp;We give a special</div><div class="code_line">&nbsp;&nbsp; &nbsp; * message if it doesn&#39;t.</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((! newfile) &amp;&amp; (! exists(pwfilename))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;%s: cannot modify file %s; use &#39;-c&#39; to create it\n&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;argv[0], pwfilename);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;fopen&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit(ERR_FILEPERM);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Verify that we can read the existing file in the case of an update</div><div class="code_line">&nbsp;&nbsp; &nbsp; * to it (rather than creation of a new one).</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((! newfile) &amp;&amp; (! readable(pwfilename))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;%s: cannot open file %s for read access\n&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;argv[0], pwfilename);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;fopen&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit(ERR_FILEPERM);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Now check to see if we can preserve an existing file in case</div><div class="code_line">&nbsp;&nbsp; &nbsp; * of password verification errors on a -c operation.</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (newfile &amp;&amp; exists(pwfilename) &amp;&amp; (! readable(pwfilename))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;%s: cannot open file %s for read access\n&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;%s: existing auth data would be lost on &quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;password mismatch&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;argv[0], pwfilename, argv[0]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;fopen&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit(ERR_FILEPERM);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Now verify that the file is writable!</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (! writable(pwfilename)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;%s: cannot open file %s for write access\n&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;argv[0], pwfilename);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;fopen&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit(ERR_FILEPERM);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * All the file access checks (if any) have been made. &nbsp;Time to go to work;</div><div class="code_line">&nbsp;&nbsp; &nbsp; * try to create the record for the username in question. &nbsp;If that</div><div class="code_line">&nbsp;&nbsp; &nbsp; * fails, there&#39;s no need to waste any time on file manipulations.</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Any error message text is returned in the record buffer, since</div><div class="code_line">&nbsp;&nbsp; &nbsp; * the mkrecord() routine doesn&#39;t have access to argv[].</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;i = mkrecord(user, record, sizeof(record) - 1,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; noninteractive ? password : NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; alg);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (i != 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;%s: %s\n&quot;, argv[0], record);</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (nofile) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;%s\n&quot;, record);</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit(0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * We can access the files the right way, and we have a record</div><div class="code_line">&nbsp;&nbsp; &nbsp; * to add or update. &nbsp;Let&#39;s do it..</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;errno = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;tempfilename = tmpnam(tname_buf);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((tempfilename == NULL) || (*tempfilename == &#39;{text}&#39;)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;%s: unable to generate temporary filename\n&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;argv[0]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (errno == 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;errno = ENOENT;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;perror(&quot;tmpnam&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit(ERR_FILEPERM);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;ftemp = fopen(tempfilename, &quot;w+&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (ftemp == NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;%s: unable to create temporary file &#39;%s&#39;\n&quot;, argv[0],</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tempfilename);</div><div class="code_line">&nbsp;&nbsp; &nbsp;perror(&quot;fopen&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit(ERR_FILEPERM);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * If we&#39;re not creating a new file, copy records from the existing</div><div class="code_line">&nbsp;&nbsp; &nbsp; * one to the temporary file until we find the specified user.</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (! newfile) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;char scratch[MAX_STRING_LEN];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;fpw = fopen(pwfilename, &quot;r&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (! (getline(line, sizeof(line), fpw))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;char *colon;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ((line[0] == &#39;#&#39;) || (line[0] == &#39;{text}&#39;)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;putline(ftemp, line);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;strcpy(scratch, line);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; * See if this is our user.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;colon = strchr(scratch, &#39;:&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (colon != NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*colon = &#39;{text}&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (strcmp(user, scratch) != 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;putline(ftemp, line);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;found++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (found) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;Updating &quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;Adding &quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;password for user %s\n&quot;, user);</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Now add the user record we created.</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;putline(ftemp, record);</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * If we&#39;re updating an existing file, there may be additional</div><div class="code_line">&nbsp;&nbsp; &nbsp; * records beyond the one we&#39;re updating, so copy them.</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (! newfile) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;copy_file(ftemp, fpw);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fclose(fpw);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;/*</div><div class="code_line">&nbsp;&nbsp; &nbsp; * The temporary file now contains the information that should be</div><div class="code_line">&nbsp;&nbsp; &nbsp; * in the actual password file. &nbsp;Close the open files, re-open them</div><div class="code_line">&nbsp;&nbsp; &nbsp; * in the appropriate mode, and copy them file to the real one.</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;fclose(ftemp);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fpw = fopen(pwfilename, &quot;w+&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ftemp = fopen(tempfilename, &quot;r&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;copy_file(fpw, ftemp);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fclose(fpw);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fclose(ftemp);</div><div class="code_line">&nbsp;&nbsp; &nbsp;unlink(tempfilename);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Эта тема была разделена из темы &quot;<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=129470' target='_blank'>Что это за ошибка?</a>&quot;</span></span>]]></description>
        <author>nekto550</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	