亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? unitmain.pas

?? Delphi7版飛信GreenFetion源碼
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit UnitMain;

interface

uses
  UnitSHA1,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdTCPConnection, IdTCPClient,
  IdHTTP, StdCtrls, IEHTTP3, IdHashMessageDigest, IdGlobal, IdHash, xmldom,
  XMLIntf, msxmldom, XMLDoc, Buttons, ExtCtrls, ComCtrls, jpeg, IdBaseComponent,
  IdComponent;

const
  LOGON_REQUEST_INVITE = 'fetion.com.cn SIP-C/2.0';
  LOGON_REQUEST_ARG = '<args><device type="PC" version="33" client-version="3.3.0370" />' +
    '<caps value="simple-im;im-session;temp-group;personal-group" /><events value="contact;permission;system-message;personal-group" /><user-info attributes="all" /><presence><basic value="400" desc="" /></presence></args>';
  LOGON_GETCONTACTLIST_ARG = '<args><contacts><buddy-lists /><buddies attributes="all" /><mobile-buddies attributes="all" /><chat-friends /><blacklist /></contacts></args>';
  LOGON_GETCONTACTINFO_ARG = '<args><contacts attributes="provisioning;impresa;mobile-no;nickname;name;gender;portrait-crc;ivr-enabled" extended-attributes="score-level">'; //<contact uri="sip:689685467@fetion.com.cn;p=9805" version="12" /></contacts></args>';

 // SALT = #$77+#$7A+#$6D+#$03;
  SALT = #$FD + #$A5 + #$E5 + #$01;

const
  MSG_FONT_SIZE = 10;
  MSG_FONT_COLOR = clBlack;
  SYSMSG_FONT_SIZE = 8;
  SYSMSG_FONT_COLOR = clGreen;

type
  // 用戶信息
  TUserInfo = record
    Sid: string; // 飛信標識
    IsFetionUser: Boolean;
    Name, NickName, LocalName, MobileNum: string;
    Group: Integer;
  end;

  // 聯系人列表管理
  TContactList = class
  private
    FUserList: array of TUserInfo;
    function GetCount: Integer;
    function GetItem(itemIndex: Integer): TUserInfo;
    function GetUserName(itemIndex: Integer): string;
  public
    procedure Clear;
    procedure AddUser(aSid, aLocalName: string; IsFetionUser: Boolean; aGroup: Integer; aMobileNum: string = ''; aNickName: string = ''; aName: string = '');
    procedure UpdateUserNickName(aSid, aNickName, aName, aMobileNum: string);
    function GetUserSidByName(aName: string): string;
  public
    property Count: Integer read GetCount;
    property Items[itemIndex: Integer]: TUserInfo read GetItem;
    property UserName[itemIndex: Integer]: string read GetUserName;
  end;

  TFormMain = class(TForm)
    IdTCPClient1: TIdTCPClient;
    reLogMsg: TRichEdit;
    Panel1: TPanel;
    Panel2: TPanel;
    mmMsg: TMemo;
    btSendMsg: TBitBtn;
    Label1: TLabel;
    cbContactList: TComboBox;
    tmRegister: TTimer;
    IdHTTP1: TIdHTTP;
    Panel3: TPanel;
    Image1: TImage;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure btSendMsgClick(Sender: TObject);
    procedure tmRegisterTimer(Sender: TObject);
    procedure Label2Click(Sender: TObject);
  private
    { Private declarations }
    XMLReader: TXMLDocument;

    FPhoneNum: string;
    FPassWord: string;
    FSSIC: string;
    FUserURI: string; // 用戶飛信標識
    FUserSid: string; // 飛信號
    FDomain: string; // 飛信標識中的域名
    FSalt: string;
    FNonce: string;
    FCNonce: string;

    FSIPCServer: string;
    FSIPCPort: Integer;
    FSSISignInURL: string;

    FContactList: TContactList;

    FCall: Integer;
    FRegisterCount: Integer;
    function GetNextCall: Integer;
    function GetNextRegisterCount: Integer;
    function BuildSIPRequest(Cmd: string; fields: array of string;
      arg: string; CmdTryCount: Integer = 1): string;
    function GetSIPResponse(Cmd: string; var ResponseMsg: string): Boolean;

    function hash_password(pwd: string): string;
    function calc_salt(pwd: string): string;
    function calc_cnonce: string;
    function calc_response(sid, domain, pwd, nonce, cnonce: string): string;
    function build_reponse_A: string;

    function SendMessage(uri, msg: string): Boolean;
    procedure RetrivePersonalInfo; // 獲取自己的信息
    procedure RetriveContractInfo(aSubscribeResponse: string); // 從預定信息回復中獲取某聯系人信息
    procedure RetriveContractList;
    procedure AddLogMsg(msg: string; FontColor: TColor);
    procedure AddSysMsg(msg: string; FontColor: TColor);

    function SocketReadLn: String;
    procedure SocketWrite(aStr: String);
  public
    { Public declarations }

    function Login(PhoneNum, Password: string): Boolean;
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

uses UnitLogin, About;

function GetSubStringBetween(aString, beginstr, endstr: string): string;
var Len, index, beginPos: Integer;
begin
  Len := 0;
  if Pos(beginstr, aString)<=0 then
    Exit;
  if Pos(endstr, aString)<=0 then
    Exit;

  beginPos := Pos(beginstr, aString) + Length(beginstr);
  index := beginPos;
  while aString[index] <> endstr[1] do
  begin
    Inc(index);
    Inc(Len);
  end;
  Result := Copy(aString, beginPos, Len);
end;

procedure TFormMain.AddLogMsg(msg: string; FontColor: TColor);
var
  P: Integer;
begin
  P := Length(reLogMsg.Text); //Keep Append Position
  with reLogMsg do
  begin
    Lines.Add(msg);
    Lines.Add('--------------------');
    SelStart := P;
    SelLength := Length(reLogMsg.Text) - P;
    SelAttributes.Color := FontColor;
    SelAttributes.Size := MSG_FONT_SIZE;
  end;
  Windows.SendMessage(reLogMsg.Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;

procedure TFormMain.AddSysMsg(msg: string; FontColor: TColor);
var
  P: Integer;
begin
  P := Length(reLogMsg.Text); //Keep Append Position
  with reLogMsg do
  begin
    Lines.Add('【系統提示】:' + msg);
    SelStart := P;
    SelLength := Length(reLogMsg.Text) - P;
    SelAttributes.Color := FontColor;
    SelAttributes.Size := SYSMSG_FONT_SIZE;
  end;
  Windows.SendMessage(reLogMsg.Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;

procedure TFormMain.btSendMsgClick(Sender: TObject);
begin
  if mmMsg.Text = '' then
    Exit;
  AddLogMsg(mmMsg.Text, clBlack);
  if SendMessage(FContactList.Items[cbContactList.ItemIndex].Sid, mmMsg.Text) then
    AddSysMsg('短信發送完畢!' + #$0D + #$0A, clGreen)
  else
    AddSysMsg('短信發送失敗!' + #$0D + #$0A, clRed);
  mmMsg.Clear;

end;

function TFormMain.BuildSIPRequest(Cmd: string; fields: array of string;
  arg: string; CmdTryCount: Integer = 1): string;
var I: Integer;
begin
  Result := Cmd + ' ' + LOGON_REQUEST_INVITE;
  Result := Result + #$D + #$A + 'F: ' + FUserSid;
  if Cmd = 'R' then
  begin
    Result := Result + #$D + #$A + 'I: 1';
  end else
  begin
    if CmdTryCount = 1 then
      Result := Result + #$D + #$A + 'I: ' + IntToStr(GetNextCall())
    else
      Result := Result + #$D + #$A + 'I: ' + IntToStr(FCall);
  end;
  Result := Result + #$D + #$A + 'Q: ' + IntToStr(CmdTryCount) + ' ' + Cmd;
  for I := 0 to Length(fields) - 1 do
    Result := Result + #$D + #$A + fields[I];
  if Length(arg) > 0 then
  begin
    Result := Result + #$D + #$A + 'L: ' + IntToStr(Length(arg))
      + #$D + #$A + #$D + #$A
      + arg;
  end else
  begin
    Result := Result + #$D + #$A + #$D + #$A;
  end;
end;


function TFormMain.GetSIPResponse(Cmd: string; var ResponseMsg: string): Boolean;
var CmdLine: string;
  // 讀取一個完整的SIP響應,并返回SIP響應對應的命令
  function ReadASIPResponse(var SIPMsg: string): string;
  var NewLine, SIPCmd: string;
    tmpIndex: Integer;
    MsgLength: Integer;
  begin
    Result := '';
    MsgLength := 0;
    CmdLine := SocketReadLn(); // SIP 響應頭
    if Length(CmdLine) <= 0 then
      Exit;
    repeat
      NewLine := SocketReadLn();
      if Length(NewLine) <= 0 then
        Break;
      if UpperCase(NewLine[1]) = 'Q' then
      begin
          // 提取SIP命令
        tmpIndex := Pos(' ', NewLine);
        tmpIndex := PosIdx(' ', NewLine, tmpIndex + 1);
        Result := Copy(NewLine, tmpIndex + 1, MaxInt);
      end;
      if UpperCase(NewLine[1]) = 'L' then
      begin
          // 獲取SIP消息長度
        tmpIndex := Pos(' ', NewLine);
        MsgLength := StrToIntDef(Copy(NewLine, tmpIndex + 1, MaxInt), 0);
      end;
      if UpperCase(NewLine[1]) = 'W' then
      begin
          // 獲取登錄認證時服務器提供的Nonce
        FNonce := GetSubStringBetween(NewLine, 'nonce="', '"');
      end;
    until False;

    if MsgLength <= 0 then
      Exit;

    // 讀取SIP消息
    SIPMsg := IdTCPClient1.ReadString(MsgLength);

    // 獲取聯系人信息
    if Result = 'BN' then
      RetriveContractInfo(SIPMsg);
  end;
begin
  Result := False;
  ResponseMsg := '';
  try
    // 讀取與命令無關的響應
    while ReadASIPResponse(ResponseMsg) <> Cmd do ;

    if Pos('200 OK', CmdLine) > 0 then
      Result := True
    else
      if Pos('280 Send SMS OK', CmdLine) > 0 then
        Result := True;
  except
  end;
end;


function TFormMain.build_reponse_A: string;
begin
  FSalt := calc_salt(FPassWord);
  FCNonce := calc_cnonce;
//  Result := 'Digest algorithm="SHA1-sess",response="'
  Result := 'Digest '
//    + 'algorithm="MD5-sess",'
  + 'algorithm="SHA1-sess",'
    + 'response="' + calc_response(FUserSid, FDomain, FPassWord, FNonce, FCNonce)
    + '",cnonce="' + FCNonce
    + '",salt="' + FSalt
    + '",ssic="' + FSSIC
    + '"';
end;

function TFormMain.hash_password(pwd: string): string;
var
  SHA1Context: TSHA1Context;
  SHA1Digest: TSHA1Digest;
  tmpStr: string;
  p, r: array[0..256] of char;
begin
  FillMemory(@p[0], 257, 0);
  FillMemory(@r[0], 257, 0);

  SHA1Init(SHA1Context);
  SHA1Update(SHA1Context, PChar(pwd), Length(pwd));
  SHA1Final(SHA1Context, SHA1Digest);
  tmpStr := SALT + PChar(@SHA1Digest);
  StrCopy(p, PChar(tmpStr));

  SHA1Init(SHA1Context);
  SHA1Update(SHA1Context, @p[0], StrLen(p));
  SHA1Final(SHA1Context, SHA1Digest);

  tmpStr := SALT + PChar(@SHA1Digest);
  BinToHex(PChar(tmpStr), r, Length(tmpStr));
  Result := UpperCase(r);
end;

procedure TFormMain.Label2Click(Sender: TObject);
begin
  FormAbout.ShowModal;
end;

function TFormMain.Login(PhoneNum, Password: string): Boolean;
var
  deliPos, I: Integer;
  FResult: WideString;
  IEHttp1: TIEHTTP;
  Request: TStringList;
  RequestArg, ResponseMsg: string;
  procedure ExploreNode(aNode: IXMLNode);
  var I, J: Integer;
  begin
    if aNode.NodeName = 'sipc-proxy' then
    if aNode.IsTextElement then
    begin
      if Pos(':', aNode.Text)<=0 then
      begin
        FSIPCServer := aNode.Text;
      end else
      begin
        FSIPCServer := Copy(aNode.Text, 1, Pos(':', aNode.Text)-1);
        FSIPCPort := StrToIntDef(Copy(aNode.Text, Pos(aNode.Text, ':')+1, Length(aNode.Text)), 8080);
      end;
    end;
    if aNode.NodeName = 'ssi-app-sign-in' then
    if aNode.IsTextElement then
      FSSISignInURL := aNode.Text;

    for I := 0 to aNode.ChildNodes.Count - 1 do
    begin
      ExploreNode(aNode.ChildNodes[I]);
    end;
  end;
begin
  Result := False;
  if PhoneNum = '' then
    Exit;
  if Password = '' then
    Exit;
  FPassWord := AnsiToUtf8(Password);

  // 獲取登錄服務器和通信服務器地址
  Request := TStringList.Create;
  try
    try
      IdHTTP1.ReadTimeout := 3000;
      IdHTTP1.ConnectTimeout := 3000;
      Request.Text := '<config><user mobile-no="'+PhoneNum+'" /><client type="PC" version="3.3.0370" platform="W5.1" /><servers version="0" /><service-no version="37" /></config>';
      XMLReader.XML.Text := IdHTTP1.Post('http://nav.fetion.com.cn/nav/getsystemconfig.aspx', Request);
      XMLReader.Active := True;
      ExploreNode(XMLReader.Node);
    except
    end;
  finally
    Request.Free;
  end;

  // 開始登錄過程
  // 第一步: 連接SSIPortal服務器,獲取SSI及用戶飛信號
  IEHttp1 := TIEHTTP.Create(Self);
  try
    try
      IEHTTP1.ExecuteURL(FSSISignInURL+'?mobileno='
        + PhoneNum + '&domains=&digest=' + hash_password(FPassWord));
      FResult := IEHTTP1.sl.Text;
      deliPos := Pos('; ', IEHTTP1.cookies.Values['ssic']);
      FSSIC := IEHTTP1.cookies.Values['ssic'];
      if deliPos > 0 then
        SetLength(FSSIC, deliPos - 1);
    except
      Exit;
    end;
  finally
    IEHttp1.Free;
  end;


  FUserURI := GetSubStringBetween(FResult, 'uri="', '"');
  FUserSid := GetSubStringBetween(FUserURI, 'sip:', '@');
  FDomain := GetSubStringBetween(FUserURI, '@', ';');

  // 第二步: 使用SIP協議登錄通信服務器
  try
    IdTCPClient1.Host := FSIPCServer;
    IdTCPClient1.Port := FSIPCPort;
    IdTCPClient1.Connect;

    // 先獲取nonce
    SocketWrite(BuildSIPRequest('R', [], LOGON_REQUEST_ARG, GetNextRegisterCount()));
    GetSIPResponse('R', ResponseMsg);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人激情av网| 欧美一卡在线观看| 手机精品视频在线观看| 久久久不卡网国产精品一区| 91视频免费看| 久久综合狠狠综合久久激情| 久久疯狂做爰流白浆xx| 欧美精品一区二区三区一线天视频 | 精品国产自在久精品国产| 国产精品区一区二区三| 国产在线视频一区二区三区| 欧美一区二区三区在线观看视频| 国产精品麻豆网站| 99re在线精品| 一级特黄大欧美久久久| 99国产麻豆精品| 日本视频在线一区| 精品福利在线导航| 一本一道久久a久久精品| 日韩免费一区二区三区在线播放| 国产精品美女www爽爽爽| 免费看欧美美女黄的网站| 欧美精品一卡二卡| 国产成人免费网站| 国产精品久久国产精麻豆99网站 | 91美女在线视频| 日韩精品在线看片z| 日韩精品一区二区三区中文不卡| 亚洲视频中文字幕| 视频一区视频二区在线观看| 亚洲欧美日韩系列| 亚洲不卡av一区二区三区| 成人免费av在线| 色94色欧美sute亚洲13| 日韩高清不卡在线| 亚洲欧美一区二区三区孕妇| 亚洲一区影音先锋| 国产三级三级三级精品8ⅰ区| 91黄色小视频| 91视视频在线观看入口直接观看www | 欧美日韩一区小说| 在线一区二区视频| 在线一区二区三区做爰视频网站| 一本色道a无线码一区v| 色呦呦一区二区三区| 色呦呦网站一区| 欧美日韩一区二区三区四区| 欧美日高清视频| 欧美老人xxxx18| 91精品国产福利| 精品毛片乱码1区2区3区| 久久午夜老司机| 亚洲一区二区三区四区中文字幕| 日韩精品一区二区三区蜜臀| 欧美一区二区精品| 欧美一级夜夜爽| 精品国产91久久久久久久妲己| 精品久久久久久久一区二区蜜臀| 国产亚洲女人久久久久毛片| 欧美激情中文字幕一区二区| 国产精品久久久久久户外露出 | 国产精品一二一区| 成人黄色在线看| 色天使久久综合网天天| 欧美视频一二三区| 精品久久久网站| 国产精品毛片久久久久久| 亚洲综合999| 久久99在线观看| 国产91精品欧美| 在线视频你懂得一区| 7777女厕盗摄久久久| 精品盗摄一区二区三区| 精品日韩成人av| 国产精品国产三级国产普通话蜜臀 | 成人免费看片app下载| 91蜜桃视频在线| 欧美一级专区免费大片| 国产婷婷精品av在线| 一区二区视频在线看| 日本sm残虐另类| 国产.欧美.日韩| 欧美日韩综合在线免费观看| 欧美成人官网二区| 亚洲三级理论片| 久久爱www久久做| 91视频免费观看| 精品国产乱码久久久久久久| 成人欧美一区二区三区视频网页| 日韩精品91亚洲二区在线观看 | 另类综合日韩欧美亚洲| a亚洲天堂av| 91精品国产入口在线| 专区另类欧美日韩| 色综合色狠狠综合色| 69堂精品视频| 国产精品欧美一区二区三区| 日日夜夜免费精品| 91在线观看下载| 久久你懂得1024| 日韩高清一区二区| 色综合久久88色综合天天免费| 精品国产乱码久久久久久影片| 有码一区二区三区| 国产精品1区2区| 日韩欧美高清dvd碟片| 亚洲综合一区二区三区| 国产成人三级在线观看| 欧美一二三区在线观看| 亚洲一区二区视频在线观看| 成人免费av网站| 久久久99久久精品欧美| 日本成人在线视频网站| 天堂蜜桃91精品| 日本丰满少妇一区二区三区| 自拍偷拍欧美激情| 91看片淫黄大片一级在线观看| 国产亚洲婷婷免费| 伦理电影国产精品| 精品美女在线观看| 色婷婷激情一区二区三区| 91精品国产综合久久精品性色| 亚洲免费伊人电影| 成人h版在线观看| 久久丝袜美腿综合| 国产麻豆一精品一av一免费| 91久久精品一区二区三| **性色生活片久久毛片| 狠狠色丁香婷婷综合| av成人动漫在线观看| 一区二区三区不卡在线观看| 欧美videos中文字幕| 亚洲视频一区二区在线观看| 美腿丝袜亚洲色图| 国产精品亲子乱子伦xxxx裸| 性久久久久久久| 亚洲18色成人| 国产精品538一区二区在线| 日韩欧美视频在线| 亚洲444eee在线观看| 99re这里只有精品视频首页| 国产欧美中文在线| 国产九九视频一区二区三区| 91麻豆成人久久精品二区三区| 国产精品日产欧美久久久久| 精品一区二区三区免费毛片爱| 91精品在线观看入口| 午夜欧美在线一二页| 欧美日韩在线播放| 欧美乱妇20p| 久久精品国产久精国产| 久久久久久夜精品精品免费| 91亚洲资源网| 免费不卡在线观看| 久久久久免费观看| 欧美日韩一二三| 国产真实乱偷精品视频免| 欧洲激情一区二区| 日本不卡在线视频| 国产激情精品久久久第一区二区| 欧美一区二区三区思思人| 亚洲免费av在线| 欧美最新大片在线看| 亚洲一区免费观看| 欧美另类久久久品| 久久国产精品色婷婷| 国产精品女上位| 91在线一区二区三区| 一区二区三区中文在线观看| 91久久精品一区二区| 午夜激情一区二区| 精品1区2区在线观看| 国产麻豆日韩欧美久久| 国产日韩欧美在线一区| 国产在线不卡视频| 亚洲欧洲韩国日本视频| 91免费国产在线观看| 美女在线视频一区| 久久久电影一区二区三区| 成人一区二区三区视频在线观看| 亚洲一区二区视频| 日韩一区二区不卡| 岛国精品一区二区| 日韩电影在线一区二区| 欧洲国内综合视频| 日韩黄色免费网站| 久久久久久久久久久99999| 成人在线综合网| 亚洲国产日韩综合久久精品| 欧美精品aⅴ在线视频| 激情伊人五月天久久综合| 国产精品久久一级| 欧美日韩成人高清| 国产精品88av| 亚洲视频一区在线| 亚洲精品在线观| 色综合天天综合网天天看片| 日本强好片久久久久久aaa| 日韩欧美高清一区| 欧美日韩电影在线|