NextPVR Forums
  • ______
  • Home
  • New Posts
  • Wiki
  • Members
  • Help
  • Search
  • Register
  • Login
  • Home
  • Wiki
  • Members
  • Help
  • Search
NextPVR Forums Public Developers v
« Previous 1 … 16 17 18 19 20 … 93 Next »
Ping UncleJohnsBand (question about npvr soap)

 
  • 0 Vote(s) - 0 Average
Ping UncleJohnsBand (question about npvr soap)
ioan
Offline

Member

Posts: 80
Threads: 12
Joined: Sep 2006
#1
2011-02-17, 06:43 PM (This post was last modified: 2011-02-17, 07:32 PM by ioan.)
Hi,
I'm trying to connect to npvr's web service to schedule a recording.
I translated to Delphi Prism and compiled the code from webServiceAuthentication.cs, and I get the R, RL, RTL values. I copy them to my web services client application to test, but I get "unauthorized" every time. Here is the code, can you please take a look and tell me what I'm doing wrong (hashMe the two Encrypt and button1_Click which creates R, RL, RTL). The code is just copied from webServiceAuthentication.cs and I think it should work... but it doesn't. What am I missing?

Code:
namespace WindowsApplication1;

interface

uses
  System.Drawing,
  System.Collections,
  System.Collections.Generic,
  System.Windows.Forms,
  System.ComponentModel,
  System,
  System.IO,
  System.Security.Cryptography,
  System.Text;

type
  /// <summary>
  /// Summary description for MainForm.
  /// </summary>
  MainForm = partial class(System.Windows.Forms.Form)
  private
    method button1_Click(sender: System.Object; e: System.EventArgs);
    method hashMe(input: string): string;
    method Encrypt(clearText: string; Password: string; Salt: array of byte; iteration: Integer): string;
    method Encrypt(clearData: array of byte; Key: array of byte; IV: array of byte): array of byte;
  protected
    method Dispose(disposing: Boolean); override;
  public
    constructor;
  end;

implementation

{$REGION Construction and Disposition}

method MainForm.hashMe(input: string): string;
begin
  var x: MD5CryptoServiceProvider := new MD5CryptoServiceProvider();
  var bs:  array of byte := System.Text.Encoding.UTF8.GetBytes(input);
  bs := x.ComputeHash(bs);
  var s: StringBuilder := new StringBuilder();
  for each b: byte in bs do
  begin
    s.Append(b.ToString("x2").ToLower());
  end;
  var password: string := s.ToString();
  result:=password;
end;

//Encrypt a byte array into a byte array using a key and an IV
method MainForm.Encrypt(clearData: array of byte; Key: array of byte; IV: array of byte): array of byte;
begin
  // Create a MemoryStream to accept the encrypted bytes
  var ms: MemoryStream  := new MemoryStream();
  // Create a symmetric algorithm.
  // We are going to use Rijndael because it is strong and
  // available on all platforms.
  // You can use other algorithms, to do so substitute the
  // next line with something like
  //      TripleDES alg = TripleDES.Create();
  var alg: Rijndael := Rijndael.Create();

  // Now set the key and the IV.
  // We need the IV (Initialization Vector) because
  // the algorithm is operating in its default
  // mode called CBC (Cipher Block Chaining).
  // The IV is XORed with the first block (8 byte)
  // of the data before it is encrypted, and then each
  // encrypted block is XORed with the
  // following block of plaintext.
  // This is done to make encryption more secure.
  // There is also a mode called ECB which does not need an IV,
  // but it is much less secure.
  alg.Key := Key;
  alg.IV := IV;

  // Create a CryptoStream through which we are going to be
  // pumping our data.
  // CryptoStreamMode.Write means that we are going to be
  // writing data to the stream and the output will be written
  // in the MemoryStream we have provided.
  var cs: CryptoStream := new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);

  // Write the data and make it do the encryption
  cs.Write(clearData, 0, clearData.Length);

  // Close the crypto stream (or do FlushFinalBlock).
  // This will tell it that we have done our encryption and
  // there is no more data coming in,
  // and it is now a good time to apply the padding and
  // finalize the encryption process.
  cs.Close();

  // Now get the encrypted data from the MemoryStream.
  // Some people make a mistake of using GetBuffer() here,
  // which is not the right way.
  var encryptedData: Array of byte := ms.ToArray();

  result := encryptedData;
end;

// Encrypt a string into a string using a password
//    Uses Encrypt(byte[], byte[], byte[])
method MainForm.Encrypt(clearText: string; Password: string; Salt: array of byte; iteration: Integer): string;
begin
  // First we need to turn the input string into a byte array.

  var clearBytes: Array of byte := System.Text.Encoding.Unicode.GetBytes(clearText);

  // Then, we need to turn the password into Key and IV
  // We are using salt to make it harder to guess our key
  // using a dictionary attack -
  // trying to guess a password by enumerating all possible words.

  var pdb: Rfc2898DeriveBytes := new Rfc2898DeriveBytes(Password, Salt, iteration);

  // Now get the key/IV and do the encryption using the
  // function that accepts byte arrays.
  // Using PasswordDeriveBytes object we are first getting
  // 32 bytes for the Key
  // (the default Rijndael key length is 256bit = 32bytes)
  // and then 16 bytes for the IV.
  // IV should always be the block size, which is by default
  // 16 bytes (128 bit) for Rijndael.
  // If you are using DES/TripleDES/RC2 the block size is
  // 8 bytes and so should be the IV size.
  // You can also read KeySize/BlockSize properties off
  // the algorithm to find out the sizes.

  var encryptedData: Array of byte := Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16));

  // Now we need to turn the resulting byte array into a string.
  // A common mistake would be to use an Encoding class for that.
  //It does not work because not all byte values can be
  // represented by characters.
  // We are going to be using Base64 encoding that is designed
  //exactly for what we are trying to do.

  result := Convert.ToBase64String(encryptedData);
end;

constructor MainForm;
begin
  //
  // Required for Windows Form Designer support
  //
  InitializeComponent();

  //
  // TODO: Add any constructor code after InitializeComponent call
  //
end;

method MainForm.Dispose(disposing: Boolean);
begin
  if disposing then begin
    if assigned(components) then
      components.Dispose();

    //
    // TODO: Add custom disposition code here
    //
  end;
  inherited Dispose(disposing);
end;
{$ENDREGION}

method MainForm.button1_Click(sender: System.Object; e: System.EventArgs);
begin
  var iterations: Integer := 25;
  var userPassword: string := 'my_password';
  var userName: string := 'my_username';
  //Use the current date/time to create the Salt for the encryption of the userid and password
  var timeString: string := DateTime.Now.ToUniversalTime().ToString();
  var encodingSalt: Array of byte := Encoding.ASCII.GetBytes(hashMe(timeString));

  //Encrypt the credentials using the entered password hash (if correct the has will match what is stored in NEWA config)
  //as the encryption password along with the Salt
  var pwdHash: string := hashMe(userPassword).ToLower();
  var pwd: string := Encrypt(userPassword, pwdHash, encodingSalt, iterations);
  var id: string := Encrypt(userName, pwdHash, encodingSalt, iterations);

  var guid_: Guid := Guid.NewGuid();
  //We're encrypting the date/time we used to create the salt with the guid so the decrypt of the re-passed credentials knows
  //what is used as the salt
  tRL.Text := Encrypt(id.Length.ToString(), pwdHash, Encoding.ASCII.GetBytes(guid_.ToString()), iterations);
  var rt: string := Encrypt(timeString, pwdHash, Encoding.ASCII.GetBytes(guid_.ToString()), iterations);
  tRTL.Text := Encrypt(rt.Length.ToString(), pwdHash, Encoding.ASCII.GetBytes(guid_.ToString()), iterations);
  tR.Text := rt + id + pwd + guid_;
end;

end.

And here what my client is trying to send:

Code:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Header><NS1:webServiceAuthentication2 xmlns:NS1="http://tempuri.org/"><NS1:R>JaqJBCCG4ofNcAphF+JfML/Jwz1Id3qoD8I08esgSr+hi3NQlrG3gXKI/TQSAU/6vnJ3LY/JqbclDXGLV1Q5JQ==SqAs+5/fRb81e1F4eAbMmmWzXUp1laHCaD5zdKsk5dU=42df2c61-b911-494d-aeab-b0dbb91dfd07</NS1:R><NS1:RL>R5MopDPnitodBgwgaLiGEA==</NS1:RL><NS1:RTL>5Vmrpqvt95tapw5D00n6QQ==</NS1:RTL></NS1:webServiceAuthentication2></SOAP-ENV:Header><SOAP-ENV:Body><scheduleRecording xmlns="http://tempuri.org/"><schedlSettings><epgeventOID>1199879</epgeventOID><quality>QUALITY_DEFAULT</quality><qualityBest>QUALITY_DEFAULT</qualityBest><qualityBetter>QUALITY_DEFAULT</qualityBetter><qualityGood>QUALITY_DEFAULT</qualityGood><qualityDefault>QUALITY_DEFAULT</qualityDefault><pre_padding_min>0</pre_padding_min><post_padding_min>0</post_padding_min><extend_end_time_min>0</extend_end_time_min><days_to_keep>0</days_to_keep><recordTimeInterval>recordOnce</recordTimeInterval><recordDayInterval>recordThisDay</recordDayInterval><dayMonday>false</dayMonday><dayTuesday>false</dayTuesday><dayWednesday>false</dayWednesday><dayThursday>false</dayThursday><dayFriday>false</dayFriday><daySaturday>false</daySaturday><daySunday>false</daySunday></schedlSettings></scheduleRecording></SOAP-ENV:Body></SOAP-ENV:Envelope>

What am I doing wrong?

Thanks.
ioan
Offline

Member

Posts: 80
Threads: 12
Joined: Sep 2006
#2
2011-02-18, 12:00 AM
Nevermind.

I found the problem. SOAP header was formated like:

Code:
<NS1:webServiceAuthentication xmlns:NS1="http://tempuri.org/">
  <NS1:R>..</NS1:R>
  <NS1:RL>...</NS1:RL>
  <NS1:RTL>..</NS1:RTL>
  </NS1:webServiceAuthentication>

and it should be:

Code:
<webServiceAuthentication xmlns="http://tempuri.org/">
  <R>..</R>
  <RL>...</RL>
  <RTL>..</RTL>
  </webServiceAuthentication>
UncleJohnsBand
Offline

Posting Freak

U.S.A.
Posts: 5,643
Threads: 258
Joined: Feb 2005
#3
2011-02-18, 01:12 AM
ioan Wrote:Nevermind.

I found the problem. SOAP header was formated like:

Code:
<NS1:webServiceAuthentication xmlns:NS1="http://tempuri.org/">
  <NS1:R>..</NS1:R>
  <NS1:RL>...</NS1:RL>
  <NS1:RTL>..</NS1:RTL>
  </NS1:webServiceAuthentication>

and it should be:

Code:
<webServiceAuthentication xmlns="http://tempuri.org/">
  <R>..</R>
  <RL>...</RL>
  <RTL>..</RTL>
  </webServiceAuthentication>

Ok...let me know if you have any other questions. Smile
Intel Core i7 @ 4.00GHz Skylake 14nm
ASUSTeK COMPUTER INC. Z170-DELUXE
Windows 10 Pro x64
PVR Software: NPVR 5.1.1
SiliconDust HDHomeRun HDHR5-4US Connect Quatro 4 Channel Tuner
Roku Ultra
2 PCH A-100's
« Next Oldest | Next Newest »

Users browsing this thread: 1 Guest(s)



Possibly Related Threads…
Thread Author Replies Views Last Post
  Web API only_new Question Gazavant 6 2,583 2021-04-04, 06:54 PM
Last Post: sub
  Way to tell programmatically if channel load in from NPVR has finished... gdogg371 3 2,324 2021-03-11, 03:59 PM
Last Post: mvallevand
  Plugins and NPVR. Where do we start? sub 80 68,063 2020-11-26, 10:02 PM
Last Post: mandai
  Test/Development environment for npvr.db3 scJohn 10 4,175 2020-09-04, 09:14 PM
Last Post: scJohn
  Another Artwork question scJohn 15 8,037 2019-09-10, 05:33 PM
Last Post: nonob
  How to extract M3U8 and get matching XMLTV guide data from NPVR almightyj 0 3,350 2018-10-23, 07:24 AM
Last Post: almightyj
  WEB API GuidService/Listing question(s) scJohn 6 4,217 2017-08-09, 02:18 PM
Last Post: scJohn
  skin question pBS 2 3,307 2016-06-18, 07:03 PM
Last Post: pBS
  ios app to control npvr ui idea jnbooker15 4 3,555 2015-09-21, 10:19 PM
Last Post: sub
  ios app to control npvr ui idea jnbooker15 0 2,433 2015-09-21, 06:39 PM
Last Post: jnbooker15

  • View a Printable Version
  • Subscribe to this thread
Forum Jump:

© Designed by D&D, modified by NextPVR - Powered by MyBB

Linear Mode
Threaded Mode