OfflineUpAndDownFTP_Impl.cs
1 using sage.ew.db;
2 using System;
3 using System.Collections.Generic;
4 using System.IO;
5 using System.Net;
6 using System.Net.Security;
7 using System.Security.Cryptography.X509Certificates;
8 using System.Windows;
9 
10 namespace sage.addons.offline.Negocio.Clases
11 {
15  internal class OfflineUpAndDownFTP_Impl : IOfflineUpAndDown
16  {
17  #region Propiedades
18 
19  public int _idConf
20  {
21  get
22  {
23  return _nIdConf;
24  }
25  set
26  {
27  _nIdConf = value;
28 
29  _oFtpUserData = CargarConfiguracion();
30  }
31  }
32  private int _nIdConf = 0;
33 
34  private FtpUserData _oFtpUserData = null;
35 
36  #endregion Propiedades
37 
38 
39  #region Constructores
40 
44  public OfflineUpAndDownFTP_Impl()
45  {
46 
47  }
48 
53  public OfflineUpAndDownFTP_Impl(FtpUserData config) : this()
54  {
55  _oFtpUserData = config;
56  }
57 
58  #endregion Constructores
59 
60 
61  #region Métodos públicos
62 
63 
64 
65 
72  public bool Comprobar_Conexion(FtpUserData toFtpUserData, bool lbAsistConfSig)
73  {
74  string lcRemoteUri = toFtpUserData.ToRemoteUri();
75 
76  try
77  {
78  FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(lcRemoteUri);
79  if (!string.IsNullOrWhiteSpace(toFtpUserData.proxy))
80  {
81  WebProxy proxyObject = new WebProxy(toFtpUserData.proxy, true);
82  ftpRequest.Proxy = proxyObject;
83  }
84  ftpRequest.UsePassive = !toFtpUserData.ftp_activo;
85  ftpRequest.EnableSsl = toFtpUserData.use_ssl_tls;
86  if (toFtpUserData.use_ssl_tls && !toFtpUserData.validate_server_cert)
87  {
88  ServicePointManager.ServerCertificateValidationCallback =
89  (sender, certificate, chain, errors) =>
90  {
91  return true;
92  };
93  }
94 
95  ftpRequest.Timeout = 10000;
96  ftpRequest.Credentials = new NetworkCredential(toFtpUserData.user, toFtpUserData.password);
97  ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
98  FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
99  StreamReader streamReader = new StreamReader(response.GetResponseStream());
100 
101  string lcCarpetaFtp = streamReader.ReadLine();
102 
103  //Basta con ver que la cosa ha ido bien.
104  streamReader.Close();
105  }
106  catch (Exception loEx)
107  {
108  if (!lbAsistConfSig)
109  {
110  toFtpUserData.error_message = "Se ha producido un error al obtener datos del FTP (" + loEx.Message + ").";
111  }
112  else
113  {
114  toFtpUserData.error_message = "Para avanzar al siguiente paso debe definir una configuración de conexión. Configure Servidor FTP o OneDrive para poder continuar.";
115  }
116 
117  return false;
118  }
119  finally
120  {
121  ServicePointManager.ServerCertificateValidationCallback = null;
122  }
123 
124  return true;
125  }
126 
127 
137  public bool Descargar_Fichero(string path, string fileName, string carpeta, int idConf, bool deleteSource)
138  {
139  _idConf = idConf;
140  _oFtpUserData.carpetaserv = carpeta;
141 
142  string lcRemoteUri = _oFtpUserData.ToRemoteUri();
143  try
144  {
145  FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(lcRemoteUri);
146  if (!string.IsNullOrWhiteSpace(_oFtpUserData.proxy))
147  {
148  WebProxy proxyObject = new WebProxy(_oFtpUserData.proxy, true);
149  ftpRequest.Proxy = proxyObject;
150  }
151  ftpRequest.UsePassive = !_oFtpUserData.ftp_activo;
152  ftpRequest.EnableSsl = _oFtpUserData.use_ssl_tls;
153  if (_oFtpUserData.use_ssl_tls && !_oFtpUserData.validate_server_cert)
154  {
155  ServicePointManager.ServerCertificateValidationCallback =
156  (sender, certificate, chain, errors) =>
157  {
158  return true;
159  };
160  }
161 
162  ftpRequest.Timeout = 10000;
163  ftpRequest.Credentials = new NetworkCredential(_oFtpUserData.user, _oFtpUserData.password);
164  ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
165  FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
166  StreamReader streamReader = new StreamReader(response.GetResponseStream());
167 
168  string lcCarpetaFtp = streamReader.ReadLine();
169  while (!string.IsNullOrEmpty(lcCarpetaFtp))
170  {
171  if (!lcCarpetaFtp.StartsWith("/"))
172  lcCarpetaFtp = "/" + lcCarpetaFtp;
173 
174  if (!lcCarpetaFtp.EndsWith("/"))
175  lcCarpetaFtp = lcCarpetaFtp + "/";
176 
177  if (!_oFtpUserData.rutaserv.StartsWith("/"))
178  _oFtpUserData.rutaserv = "/" + _oFtpUserData.rutaserv;
179 
180  if (!_oFtpUserData.rutaserv.EndsWith("/"))
181  _oFtpUserData.rutaserv = _oFtpUserData.rutaserv + "/";
182 
183  if (lcCarpetaFtp.ToUpper() == _oFtpUserData.rutaserv.ToUpper())
184  {
185  string fullFileName = Path.Combine(path, fileName);
186  if (Directory.Exists(path))
187  {
188  if (File.Exists(fullFileName))
189  File.Delete(fullFileName);
190  }
191  else
192  {
193  Directory.CreateDirectory(path);
194  }
195 
196  DescargarArchivoFTP(fileName, path, true, deleteSource);
197 
198  break;
199  }
200  lcCarpetaFtp = streamReader.ReadLine();
201  }
202 
203  streamReader.Close();
204  }
205  catch (Exception loEx)
206  {
207  string error = "Se ha producido un error al obtener datos del FTP (" + loEx.Message + ").";
208  //callback?.Invoke(error);
209  return false;
210  }
211  finally
212  {
213  ServicePointManager.ServerCertificateValidationCallback = null;
214  }
215 
216  return true;
217  }
218 
219 
220  public List<string> GetListFiles(string carpetaserv, int idConf)
221  {
222  List<string> lsFicheros = new List<string>();
223 
224  _idConf = idConf;
225  if(!string.IsNullOrWhiteSpace(carpetaserv))
226  _oFtpUserData.carpetaserv = carpetaserv + "/";
227 
228  return GetListFiles(_oFtpUserData);
229  }
230 
231  //Se crea este método (fuera de interfície) para poder inyectar la configuración FTP a la operación
232  //Esta pensado para la migración ANTES de ajustar la tabla MULTCONF cosa que impide el uso normal de los métodos por la fuerte dependencia interna
236  public List<string> GetListFiles(FtpUserData configFtp)
237  {
238  List<string> lsFicheros = new List<string>();
239 
240  // Ruta fichero en el FTP
241  string lcRemoteUri = configFtp.ToRemoteUri();
242 
243  lcRemoteUri = lcRemoteUri + "//" + configFtp.rutaserv + "//" + configFtp.carpetaserv;
244 
245  try
246  {
247  FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(lcRemoteUri);
248  if (!string.IsNullOrWhiteSpace(configFtp.proxy))
249  {
250  WebProxy proxyObject = new WebProxy(configFtp.proxy, true);
251  ftpRequest.Proxy = proxyObject;
252  }
253  ftpRequest.UsePassive = !configFtp.ftp_activo;
254  ftpRequest.EnableSsl = configFtp.use_ssl_tls;
255  if (configFtp.use_ssl_tls && !configFtp.validate_server_cert)
256  {
257  ServicePointManager.ServerCertificateValidationCallback =
258  (sender, certificate, chain, errors) =>
259  {
260  return true;
261  };
262  }
263 
264  ftpRequest.Timeout = 10000;
265  ftpRequest.Credentials = new NetworkCredential(configFtp.user, configFtp.password);
266  ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
267  FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
268  StreamReader streamReader = new StreamReader(response.GetResponseStream());
269 
270  string lcFichero = streamReader.ReadLine();
271  while (!string.IsNullOrEmpty(lcFichero))
272  {
273  lsFicheros.Add(lcFichero);
274 
275  lcFichero = streamReader.ReadLine();
276  }
277 
278  streamReader.Close();
279  }
280  catch (Exception)
281  {
282  return new List<string>();
283  }
284  finally
285  {
286  ServicePointManager.ServerCertificateValidationCallback = null;
287  }
288 
289  return lsFicheros;
290  }
291 
301  public bool Subir_Fichero(string archivo, string zipFilename, string carpeta, int idConf, ref long uploadedFileSize)
302  {
303  try
304  {
305  _idConf = idConf;
306  _oFtpUserData.carpetaserv = carpeta;
307 
308  if (!CargarArchivoFTP(archivo, zipFilename, ref uploadedFileSize))
309  {
310  string error = "No se han podido subir el fichero " + archivo + " al FTP.";
311  //callback?.Invoke(error);
312  return false;
313  }
314  }
315  catch (Exception loEx)
316  {
317  string error = "Se ha producido un error al subir datos al FTP (" + loEx.Message + ").";
318  //callback?.Invoke(error);
319  DB.Registrar_Error(loEx);
320  return false;
321  }
322 
323  return true;
324  }
325 
326 
327  #endregion Métodos públicos
328 
329 
330  #region Métodos privados
331 
332 
337  private FtpUserData CargarConfiguracion()
338  {
339  //Santi => valor idconf 0 no tengo claro si es apropiado
340  Dictionary<string, object> tablaMultconf = DB.SQLREGValor("MULTCONF", "IDCONF", _idConf.ToString(), "OFFLINE");
341 
342  string cadenaEncriptada = tablaMultconf["cfg_ftp"].ToString().Trim();
343 
344  var toolsOffline = new clsOffLine();
345  string cadenaDesencriptada = toolsOffline.Cadena_Desencriptar(cadenaEncriptada);
346 
347  var trozos = cadenaDesencriptada.Split('~');
348 
349  if (trozos.Length == 7)
350  {
351  var ftp_user_data = new FtpUserData
352  {
353  server = trozos[0].Trim(),
354  user = trozos[1].Trim(),
355  password = trozos[2].Trim(),
356  port = Convert.ToDecimal(trozos[3]),
357  proxy = trozos[4].Trim(),
358  rutaserv = trozos[5].Trim(),
359  ftp_activo = trozos[6].Trim().ToUpper() == "SI"
360  };
361  return ftp_user_data;
362  }
363  else if (trozos.Length == 9)
364  {
365  var ftp_user_data = new FtpUserData
366  {
367  server = trozos[0].Trim(),
368  user = trozos[1].Trim(),
369  password = trozos[2].Trim(),
370  port = Convert.ToDecimal(trozos[3]),
371  proxy = trozos[4].Trim(),
372  rutaserv = trozos[5].Trim(),
373  ftp_activo = trozos[6].Trim().ToUpper() == "SI",
374  use_ssl_tls = trozos[7].Trim().ToUpper() == "SI",
375  validate_server_cert = trozos[8].Trim().ToUpper() == "SI",
376  };
377  return ftp_user_data;
378  }
379 
380  throw new NotSupportedException("Error cargando configuración FTP");
381  }
382 
387  private void MakeFTPDir(FtpUserData ftpUserData)
388  {
389  FtpWebRequest ftpRequest = null;
390  Stream ftpStream = null;
391  string pathToCreate = ftpUserData.rutaserv + "//" + ftpUserData.carpetaserv;
392  string[] subDirs = pathToCreate.Split('/');
393  string currentDir = ftpUserData.ToRemoteUri();
394  bool llExist = false;
395 
396  foreach (string subDir in subDirs)
397  {
398  if (!string.IsNullOrWhiteSpace(subDir))
399  {
400  try
401  {
402  llExist = false;
403  ftpRequest = (FtpWebRequest)FtpWebRequest.Create(currentDir);
404  if (!string.IsNullOrWhiteSpace(ftpUserData.proxy))
405  {
406  WebProxy proxyObject = new WebProxy(ftpUserData.proxy, true);
407  ftpRequest.Proxy = proxyObject;
408  }
409  ftpRequest.UsePassive = !ftpUserData.ftp_activo;
410  ftpRequest.EnableSsl = ftpUserData.use_ssl_tls;
411  if (ftpUserData.use_ssl_tls && !ftpUserData.validate_server_cert)
412  {
413  ServicePointManager.ServerCertificateValidationCallback =
414  (sender, certificate, chain, errors) =>
415  {
416  return true;
417  };
418  }
419 
420  ftpRequest.Timeout = 10000;
421  ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
422  ftpRequest.Credentials = new NetworkCredential(ftpUserData.user, ftpUserData.password);
423 
424  FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
425  StreamReader streamReader = new StreamReader(response.GetResponseStream());
426 
427  string lcFolder = streamReader.ReadLine();
428  while (!string.IsNullOrEmpty(lcFolder))
429  {
430  if (lcFolder.Contains("/"))
431  {
432  lcFolder = lcFolder.Substring(lcFolder.LastIndexOf("/") + 1);
433 
434  }
435 
436  if (lcFolder.ToUpper() == subDir.ToUpper())
437  {
438  llExist = true;
439  break;
440  }
441  lcFolder = streamReader.ReadLine();
442  }
443 
444  streamReader.Close();
445  response.Close();
446 
447  currentDir = currentDir + "//" + subDir;
448 
449  if (!llExist)
450  {
451  ftpRequest = (FtpWebRequest)FtpWebRequest.Create(currentDir);
452  if (!string.IsNullOrWhiteSpace(ftpUserData.proxy))
453  {
454  WebProxy proxyObject = new WebProxy(ftpUserData.proxy, true);
455  ftpRequest.Proxy = proxyObject;
456  }
457  ftpRequest.UsePassive = !ftpUserData.ftp_activo;
458  ftpRequest.EnableSsl = ftpUserData.use_ssl_tls;
459  if (ftpUserData.use_ssl_tls && !ftpUserData.validate_server_cert)
460  {
461  ServicePointManager.ServerCertificateValidationCallback =
462  (sender, certificate, chain, errors) =>
463  {
464  return true;
465  };
466  }
467 
468  ftpRequest.Timeout = 10000;
469  ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
470  ftpRequest.UseBinary = true;
471  ftpRequest.Credentials = new NetworkCredential(ftpUserData.user, ftpUserData.password);
472 
473  response = (FtpWebResponse)ftpRequest.GetResponse();
474  ftpStream = response.GetResponseStream();
475  ftpStream.Close();
476  response.Close();
477  }
478  }
479  catch (Exception ex)
480  {
481  MessageBox.Show(ex.Message);
482  }
483  finally
484  {
485  ServicePointManager.ServerCertificateValidationCallback = null;
486  }
487  }
488  }
489  }
490 
498  private bool CargarArchivoFTP(string fileNameWithPath, string fileNameZip, ref long uploadedFileSize)
499  {
500  string lcRemoteUri = _oFtpUserData.ToRemoteUri();
501 
502  try
503  {
504  // Priemro comprobar que existe la carpeta en el FTP
505  //MakeFTPDir(lcRemoteUri, _oFtpUserData.rutaserv + "/" + _oFtpUserData.carpetaserv, _oFtpUserData.user, _oFtpUserData.password);
506  MakeFTPDir(_oFtpUserData);
507 
508  if (!string.IsNullOrWhiteSpace(fileNameZip) && File.Exists(fileNameWithPath))
509  {
510  clsOffLine utilsOffline = new clsOffLine();
511  string pathArchivoComprimido = utilsOffline.Fichero_Comprimir(fileNameWithPath, fileNameZip);
512 
513  fileNameWithPath = Path.Combine(Path.GetDirectoryName(fileNameWithPath), pathArchivoComprimido);
514  fileNameWithPath = Path.Combine(fileNameWithPath, fileNameZip);
515  }
516 
517  //Ahora subimos fichero
518  // Ruta fichero en el FTP
519  string lcFileFtp = lcRemoteUri + _oFtpUserData.rutaserv + "/" + _oFtpUserData.carpetaserv + System.IO.Path.GetFileName(fileNameWithPath);
520 
521  FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(lcFileFtp);
522  if (!string.IsNullOrWhiteSpace(_oFtpUserData.proxy))
523  {
524  WebProxy proxyObject = new WebProxy(_oFtpUserData.proxy, true);
525  ftpRequest.Proxy = proxyObject;
526  }
527  ftpRequest.UsePassive = !_oFtpUserData.ftp_activo;
528  ftpRequest.EnableSsl = _oFtpUserData.use_ssl_tls;
529  if (_oFtpUserData.use_ssl_tls && !_oFtpUserData.validate_server_cert)
530  {
531  ServicePointManager.ServerCertificateValidationCallback =
532  (sender, certificate, chain, errors) =>
533  {
534  return true;
535  };
536  }
537 
538  ftpRequest.Timeout = 10000;
539  ftpRequest.Credentials = new NetworkCredential(_oFtpUserData.user, _oFtpUserData.password);
540  ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
541 
542  // Subir fichero
543  using (Stream fileStream = File.OpenRead(fileNameWithPath))
544  {
545  using (Stream ftpStream = ftpRequest.GetRequestStream())
546  {
547  fileStream.CopyTo(ftpStream);
548  }
549  }
550 
551  uploadedFileSize = new FileInfo(fileNameWithPath).Length;
552  }
553  catch
554  {
555  throw;
556  }
557  finally
558  {
559  ServicePointManager.ServerCertificateValidationCallback = null;
560  }
561 
562  return true;
563  }
564 
565 
574  private bool DescargarArchivoFTP(string archivo, string carpetaLocal, bool uncompressZip, bool deleteSource)
575  {
576  return DescargarArchivoFTP(_oFtpUserData, archivo, carpetaLocal, uncompressZip, deleteSource);
577  }
578 
579  //Se crea este método (fuera de interfície) para poder inyectar la configuración FTP a la operación
580  //Esta pensado para la migración ANTES de ajustar la tabla MULTCONF cosa que impide el uso normal de los métodos por la fuerte dependencia interna
590  public bool DescargarArchivoFTP(FtpUserData datosFtp, string archivo, string carpetaLocal, bool uncompressZip, bool deleteSource)
591  {
592  string lcRemoteUri = datosFtp.ToRemoteUri();
593 
594  string lcDirTemp = carpetaLocal;
595  string lcFileName = Path.Combine(lcDirTemp, archivo);
596 
597  string lcFileFtp = null;
598 
599  try
600  {
601  // Ruta fichero en el FTP
602  lcFileFtp = lcRemoteUri + "//" + datosFtp.rutaserv + "//" + datosFtp.carpetaserv + "//" + archivo;
603 
604  FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(lcFileFtp);
605  if (!string.IsNullOrWhiteSpace(datosFtp.proxy))
606  {
607  WebProxy proxyObject = new WebProxy(datosFtp.proxy, true);
608  ftpRequest.Proxy = proxyObject;
609  }
610  ftpRequest.UsePassive = !datosFtp.ftp_activo;
611  ftpRequest.EnableSsl = datosFtp.use_ssl_tls;
612  if (datosFtp.use_ssl_tls && !datosFtp.validate_server_cert)
613  {
614  ServicePointManager.ServerCertificateValidationCallback =
615  (sender, certificate, chain, errors) =>
616  {
617  return true;
618  };
619  }
620 
621  ftpRequest.Timeout = 10000;
622  ftpRequest.Credentials = new NetworkCredential(datosFtp.user, datosFtp.password);
623  ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
624 
625  // bajar fichero
626  using (Stream ftpStream = ftpRequest.GetResponse().GetResponseStream())
627  {
628  using (Stream fileStream = File.Create(lcFileName))
629  {
630  ftpStream.CopyTo(fileStream);
631  }
632  }
633 
634  if (uncompressZip && File.Exists(lcFileName))
635  {
636  clsOffLine utilsOffline = new clsOffLine();
637  utilsOffline.Fichero_Descomprimir(lcFileName, Path.GetDirectoryName(lcFileName), false);
638  }
639 
640  if (deleteSource)
641  {
642  ftpRequest = (FtpWebRequest)WebRequest.Create(lcFileFtp);
643 
644  if (!string.IsNullOrWhiteSpace(datosFtp.proxy))
645  {
646  WebProxy proxyObject = new WebProxy(datosFtp.proxy, true);
647  ftpRequest.Proxy = proxyObject;
648  }
649  ftpRequest.UsePassive = !datosFtp.ftp_activo;
650  ftpRequest.EnableSsl = datosFtp.use_ssl_tls;
651  if (datosFtp.use_ssl_tls && !datosFtp.validate_server_cert)
652  {
653  ServicePointManager.ServerCertificateValidationCallback =
654  (sender, certificate, chain, errors) =>
655  {
656  return true;
657  };
658  }
659 
660  ftpRequest.Timeout = 10000;
661  ftpRequest.Credentials = new NetworkCredential(datosFtp.user, datosFtp.password);
662  ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
663 
664  FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
665  response.Close();
666  }
667  }
668  catch
669  {
670  throw;
671  }
672  finally
673  {
674  ServicePointManager.ServerCertificateValidationCallback = null;
675  }
676 
677  return true;
678  }
679 
680  private bool _LocalCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
681  {
682  return true;
683  }
684  #endregion Métodos privados
685  }
686 }
Es como el tipo de entrada asientos pero por negocio, sin formulario, pq quiero que me haga las propu...