Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 01/18/22 in all areas

  1. We are trying to make sure that this will happen! :) Mode-2 (UrlRedirect) adopts a simpler working principle compared with other two modes. Master Server's job is to redirect URL to one of the Slaves and once this happens all traffic goes to that slave server. The tricky part is to make sure that all URLs will point to the master server when a session is expired, terminated or restarted. Another thing is to make sure that a user can not directly start a session on a slave server.
    4 points
  2. We are still testing. The most tricky part is that all failed, timed out, restarted or naturally terminated sessions should be redirected back to the master server! Direct URL access should be disabled and re-routed to the master server! It is the part that we are still implementing & testing...!
    3 points
  3. Well, I've known unigi for a long time, and I have nothing to complain about, the support always helps a lot. Sometimes we have to change some detail of how to do something, but we always have answers.. My humble opnion.
    2 points
  4. New themes based on Office 365...and with a smaller font etc.
    2 points
  5. Hello, I think I found solution of this. on procedure TUniServerModule.UniGUIServerModuleHTTPCommand( just add this headers: AResponseInfo.CustomHeaders.AddValue('Cache-Control', 'no-cache, no-store, must-revalidate'); //HTTP 1.1 AResponseInfo.CustomHeaders.AddValue('Pragma','no-cache');////HTTP 1.0 AResponseInfo.CustomHeaders.AddValue('Expires', '0'); https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html this maybe will extend data transfer between Client and Server (will use more traffic)
    2 points
  6. Добрый день, Попробуйте такое решение. 1. procedure TMainForm.UniFormCreate(Sender: TObject); begin UniListBox1.ClientEvents.ExtEvents.Values['store.add'] := 'function store.add(store, records, index, eOpts){Ext.defer(function(){'+ UniListBox1.JSName +'.boundList.select(records[0])}, 10)}'; end; 2. procedure TMainForm.UniButton1Click(Sender: TObject); var s: string; begin s := 'test9 new row 123'; UniListBox1.Items.Add(s); end;
    2 points
  7. 1. UniHiddenPanel1 -> UniCheckBox1 2. procedure TMainForm.UniFormReady(Sender: TObject); begin UniDBGrid1.JSInterface.JSCall('header.insert', [1, UniCheckBox1.JSControl]) end; 3. procedure TMainForm.UniCheckBox1Change(Sender: TObject); begin // end;
    2 points
  8. we know the enormous challenge that you and your team face every day, we trust in your work.
    2 points
  9. Hi, I found a solution, thank you. Best regards
    1 point
  10. procedure TUniFrame1.UniFrameCreate(Sender: TObject); begin UniTabControl1.JSInterface.JSAddListener('resize', 'function(me){me.tabPanel.setWidth(me.getWidth())}') end;
    1 point
  11. YES, for sure. I have no doubt about Farshad's abilities, as we can already appreciate them with Unigui.
    1 point
  12. 1 point
  13. Hello, I think you can use the following approach. 1. CustomCSS: .customDisabledCls { pointer-events: none; } For example for the first button (UniPanel1). 2. "Disable": procedure TMainForm.UniButton1Click(Sender: TObject); begin with UniPanel1 do JSInterface.JSCall('addCls', ['customDisabledCls'], ToolButtons[0].JSMenuItem); end; 3. "Enable": procedure TMainForm.UniButton2Click(Sender: TObject); begin with UniPanel1 do JSInterface.JSCall('removeCls', ['customDisabledCls'], ToolButtons[0].JSMenuItem); end; 4. Important! You should also consider this logic, in the OnToolClick event: procedure TMainForm.UniPanel1ToolClick(Sender: TUniCustomButtonItem); begin // end;
    1 point
  14. Hello, I was made OneSignal. After update android studio (I have android project) to last version, then i have made on Android application notification service. This work but Android device must be >= android 9
    1 point
  15. Thank you so much IrigSoft. We are learning good things with you.
    1 point
  16. Here is list with Ip from link above: https://community.checkpoint.com/t5/Management/HowTo-Block-IoT-scanners-like-Shodan-Censys-Shadowserver-PAN/td-p/124612 Is not complete but get most of IP's from link WebScannersIpList.txt If someone want to add this in BlockedIpList
    1 point
  17. Have you tested it on other browsers too?
    1 point
  18. No problem, your English is good, I understood you. Just wanted to clarify. https://docwiki.embarcadero.com/Libraries/Sydney/en/System.Zip.TZipFile
    1 point
  19. 👍👍👍 супер
    1 point
  20. 1. function painted(sender, eOpts) { sender._tip = Ext.create('Ext.tip.ToolTip', { closable: true, align: 'tl', focusOnToFront: true, autoHide: true, autoShow: true, autoScroll: true }); } 2. function childtap(sender, location, eOpts) { if (location.sourceElement && location.sourceElement.className == 'far fa-trash-alt') { //ajaxRequest(sender, "_tap", []) //alert(location.record.data[12]); sender._tip.setHtml(location.record.data[12]); sender._tip.showByTarget(location.sourceElement); } }
    1 point
  21. 1 point
  22. It worked master, once again, thank you very much. hug.
    1 point
  23. function childtap(sender, location, eOpts) { if (location.sourceElement && location.sourceElement.className == 'far fa-trash-alt') { //ajaxRequest(sender, "_tap", []) alert(location.record.data[12]); } } data: 0: 3 1: "APART" 2: 0 3: "USD" 4: true 5: 2 6: 2 7: 15 8: "" 9: "/files/img/nopicture100.png?20012022125058" 10: "" 11: "Region1/Region2" 12: "STREET2" 13: 140 14: 46 15: "" 16: "#000000" 17: 181 18: "32/20/12"
    1 point
  24. Thank you very much, @Sherzod İ will try weekend your solution proposal and will inform you Best Regards,
    1 point
  25. Hello Sherzod, Thank you for the fast answer. So far I've only received the message on one PC. So it's not that urgent. I just wanted to know if anyone else had this error message. If there are any more problems, I'll report back. Thank you again and best regards
    1 point
  26. function beforeInit(sender, config) { config.selectMonth = null; config.createPicker = function() { var me = this, format = Ext.String.format; return Ext.create('Ext.picker.Month', { width: config.width, renderTpl: [ '<div id="{id}-bodyEl" data-ref="bodyEl" class="{baseCls}-body">', '<div style="display:none" id="{id}-monthEl" data-ref="monthEl" class="{baseCls}-months">', '<tpl for="months">', '<div class="{parent.baseCls}-item {parent.baseCls}-month">', '<a style="{parent.monthStyle}" role="button" hidefocus="on" class="{parent.baseCls}-item-inner">{.}</a>', '</div>', '</tpl>', '</div>', '<div style="width:100%" id="{id}-yearEl" data-ref="yearEl" class="{baseCls}-years">', '<div class="{baseCls}-yearnav">', '<div class="{baseCls}-yearnav-button-ct">', '<a id="{id}-prevEl" data-ref="prevEl" class="{baseCls}-yearnav-button {baseCls}-yearnav-prev" hidefocus="on" role="button"></a>', '</div>', '<div class="{baseCls}-yearnav-button-ct">', '<a id="{id}-nextEl" data-ref="nextEl" class="{baseCls}-yearnav-button {baseCls}-yearnav-next" hidefocus="on" role="button"></a>', '</div>', '</div>', '<tpl for="years">', '<div class="{parent.baseCls}-item {parent.baseCls}-year">', '<a hidefocus="on" class="{parent.baseCls}-item-inner" role="button">{.}</a>', '</div>', '</tpl>', '</div>', '<div class="' + Ext.baseCSSPrefix + 'clear"></div>', '<tpl if="showButtons">', '<div class="{baseCls}-buttons">{%', 'var me=values.$comp, okBtn=me.okBtn, cancelBtn=me.cancelBtn;', 'okBtn.ownerLayout = cancelBtn.ownerLayout = me.componentLayout;', 'okBtn.ownerCt = cancelBtn.ownerCt = me;', 'Ext.DomHelper.generateMarkup(okBtn.getRenderTree(), out);', 'Ext.DomHelper.generateMarkup(cancelBtn.getRenderTree(), out);', '%}</div>', '</tpl>', '</div>' ], pickerField: me, ownerCt: me.ownerCt, renderTo: document.body, floating: true, hidden: true, focusOnShow: true, minDate: me.minValue, maxDate: me.maxValue, disabledDatesRE: me.disabledDatesRE, disabledDatesText: me.disabledDatesText, disabledDays: me.disabledDays, disabledDaysText: me.disabledDaysText, format: me.format, showToday: me.showToday, startDay: me.startDay, minText: format(me.minText, me.formatDate(me.minValue)), maxText: format(me.maxText, me.formatDate(me.maxValue)), listeners: { select: { scope: me, fn: me.onSelect }, monthdblclick: { scope: me, fn: me.onOKClick }, yeardblclick: { scope: me, fn: me.onOKClick }, OkClick: { scope: me, fn: me.onOKClick }, CancelClick: { scope: me, fn: me.onCancelClick } }, keyNavConfig: { esc: function() { me.collapse(); } } }); }; config.onCancelClick = function() { var me = this; me.selectMonth = null; me.collapse(); }; config.onOKClick = function() { var me = this; if (me.selectMonth) { me.setValue(me.selectMonth); me.fireEvent('select', me, me.selectMonth); } me.collapse(); }; config.onSelect = function(m, d) { var me = this; me.selectMonth = new Date((d[0] + 1) + '/1/' + d[1]); }; }
    1 point
  27. Yes, perfect as I wanted.
    1 point
  28. uuuuuuuuuuuu very very good the best support on the planet Hug.
    1 point
  29. Hello, Need to analyze.
    1 point
  30. HI @Sherzod Thanks ,It's Work Fine. Best Regards.
    1 point
  31. Hello, Try this approach. 1. CustomFiles: files/particles.css files/particles.js 2. Create a json file (particles.json) in the files folder, this is the settings file, like this for example: https://github.com/VincentGarreau/particles.js/blob/master/demo/particles.json 3. UniLoginForm.Script: particlesJS.load('body', 'files/particles.json', function() { console.log('callback - particles.js config loaded'); }); 4. MainForm.Script: document.querySelector('.particles-js-canvas-el').remove();
    1 point
  32. 1 point
  33. 1 point
  34. Hello, You can try this approach: 1. uses ... Soap.EncdDecd; 2. procedure TMainForm.UniButton1Click(Sender: TObject); begin with UniButton1 do JSInterface.JSCode('html2canvas(document.querySelector("#' + JSId +'")).then(function(canvas) {ajaxRequest('#1', "getData", ["base64Data="+canvas.toDataURL()])});'); end; 3. procedure TMainForm.UniButton1AjaxEvent(Sender: TComponent; EventName: string; Params: TUniStrings); var stream: TBytesStream; base64s: string; AUrl: string; begin if EventName = 'getData' then begin base64s := Params.Values['base64Data']; base64s := StringReplace(base64s, 'data:image/png;base64,', '', [rfReplaceAll]); stream := TBytesStream.Create(DecodeBase64(base64s)); try stream.SaveToFile(UniServerModule.NewCacheFileUrl(False, 'png', '', '', AUrl, True)); UniImage1.Url := AUrl; finally stream.Free; end; end; end; 4. CustomFiles: files/html2canvas.min.js
    1 point
  35. Hello everyone, There is a new security challenge here ! the plan: There are standart technics to slow down attacker: 1 - after some trys to login (brute force attack) - log IP in BlockIPLIst. Block IP of attacker 2 - using reCaptcha - prevents bot's (some reCaptcha is useless !) 3 - using strong passwords (more then 10 symbols) - slow down GPU calculations 4 - using hash of passwords - slow down GPU calculations 5 - disable user account - attacker must change user name 6 - using same error message for different login errors. - prevent to catching user name 7 - after every next try, slow down answer from server - this will slow down GPU calculations 8 - enable OneIpPerUser - this will block many session from one PC I make some protection code based on the plan: 3 - using strong passwords (more then 10 symbols) 4 - using hash of passwords on the TUniServerModule.UniGUIServerModuleHTTPCommand TRY unIServerModule.Lock; If FileExists (ExtractFilePath(StartPath) + 'root\BldIPList.config') then BlockedIPList.LoadFromFile (ExtractFilePath(StartPath) + 'root\BldIPList.config'); - reload IP list FINALLY unIServerModule.UnLock; END; IF BlockedIPList.Count > 0 then begin if BlockedIPList.IndexOf (ARequestInfo.RemoteIP) > -1 then begin AResponseInfo.ContentText := '<h1>Access denied</h1>'; point 6 Handled := True; AResponseInfo.CloseSession; GOTO ENDALL; end; end; on the login form BtnLogin.onClick UniServerModule.Lock; try If FileExists (ExtractFilePath(unIServerModule.StartPath) + 'root\BldIPList.config') then unIServerModule.BlockedIPList.LoadFromFile (ExtractFilePath(unIServerModule.StartPath) + 'root\BldIPList.config'); finally UniServerModule.UnLock; end; //block IP if uniMainModule.BruteForceTrys > 5 then begin - point 1 // block IP addres try UniServerModule.Lock; UniServerModule.BlockedIPList.Add (UniSession.RemoteIP); UniServerModule.BlockedIPList.SaveToFile (ExtractFilePath(UniServerModule.StartPath) + 'root\BldIPList.config'); finally UniServerModule.UnLock; end; sleep (100); UniSession.Terminate ('<h1>Access denied</h1>'); - point 6 exit; end; UniGUIMainModuleCreate reload blocked Ip try UniServerModule.Lock; If FileExists (ExtractFilePath(unIServerModule.StartPath) + 'root\BldIPList.config') then unIServerModule.BlockedIPList.LoadFromFile (ExtractFilePath(unIServerModule.StartPath) + 'root\BldIPList.config'); finally UniServerModule.UnLock; end; I added some extras, such as log for IP, which made 2 or more login errors (suspicious IP addresses) 7 - after every next try, slow down answer from server - add some timers to make to wait next login attemp ! 8 - enable OneIpPerUser - ServerLimits.SessionRestrict := srOnePerPC; ServerLimits.SessionRestrict := srOnePerIP;
    1 point
×
×
  • Create New...