Friday, April 12, 2019

Code Snippet : Windows NTLM POST using Node JS

Be The First To Comment
let ntlm = require('request-ntlm-lite');

let postData = 'user=test';   //anything

let headers = {'Content-Type': 'application/x-www-form-urlencoded'};

let ntlmOptions = {                 
url: 'postUrl',
username: 'username',
password: 'password',
workstation:'',
rejectUnauthorized: false, //disable ssl certificate error
ntlm_domain: 'domain_name',
json: true,
headers:headers
};


ntlm.post(ntlmOptions, postData, function(error, response, body){
console.log(error);
console.log(response);                     
});

Database Configuration to connect with named instance SQL Server with mssql for node.js

Be The First To Comment
After some frustration, it found that Node JS mssql (5.0.5) doesn't like instance name in config file to make mssql.ConnectionPool(config)-

Works


    dbConfig: {
        "user": "user",
        "password": "pass",
        "server": "myserver",  //  Without instance name 
        "database": "dbname",
        "port":1433,
        "driver": "tedious",
        "options": {
            "instance":"mylocaldevdatabase",
            "trustedConnection": true
          }
        }


Doesn't Work

Thursday, March 28, 2019

ESRI JS API 4.8 makes default call to unsupported API to generate token.

Be The First To Comment
ESRI Identity Manager, ESRI JS API 4.8 makes default call to unsupported API to generate token.
ID calls to portal/sharing  in stead of portal/sharing/rest/ for token.

Friday, March 22, 2019

Generate ArcGIS Token By URL Request From ArcGIS Portal, Federated Environment , ESRI JS API and Angular snippets

Be The First To Comment

In my custom angular web application, I had to pull the data from different ArcGIS server environments, say Dev ArcGIS server and Test ArcGIS server environment, some of my items are directly referred from ArcGIS server services and some of them are from Enterprise portal referring the WebMapId and PortalId from both environment (Dev, Test). Servers are in federated environment.

To pull the data from different ArcGIS server environment, user must login in each environment. In addition, user must login to get inside the custom application and Enterprise AD Group was set to authenticate users on the custom web application and ArcGIS server environments. So, there will be 3 login attempts (1 –application itself, 2- Dev server/portal, 3- Test server/portal) to use the application, which doesn’t provide good user experience.

To improve the better application workflow, I decided to reduce the number of logins required in the application and use AD Username and Password captured during application login to generate token for each ArcGIS server environment. Here are some reference snippets to generate token from ArcGIS server and use tokens request parameter in ESRI JS API and Angular.


Step 1: Generate token and store tokens in session 


 devServerLogin(username, password){
     let portalTokenUrl = ....+'/portal/sharing/rest/generateToken'; //Federated evn.,  use Portal  to generate user token.

    if(username && password){
      this.httpClient.post(tokenUrl, this.getCredentials(username, password), this.getHttpOptions()).subscribe(esriResponse =>{
        sessionStorage.setItem('dev_access_token', esriResponse['token']);
        sessionStorage.setItem('dev_access_token_expires', esriResponse['expires']);
      });;
    }
  }

  private getCredentials(username, password){
    let expiration = 720; //1440 -> 60 minute * 24 = 1 day token , 720 ->  12hrs token 
    
let urlReferer = 'https://'+window.location.host+'/';     
 
 let tokenCredentials =  'username='+username+'&password='+password+'&f=json&expiration='+expiration+'&client=referer&referer='+urlReferer;

    return tokenCredentials;
  }

  private getHttpOptions(){
    let httpOptions = {
      headers: new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded', }),
      withCredentials: true,            
    };
    return httpOptions;
  }

Wednesday, November 21, 2018

ArcGIS Server SOI - HandleRESTRequest Parameter limitations

Be The First To Comment
The SOI Rest request handler method -

public byte[] HandleRESTRequest(string Capabilities, string resourceName, string operationName,
            string operationInput, string outputFormat, string requestProperties, out string responseProperties)

HandleRESTRequest paramater provides following information inside the method

capabilities Map,Query,Data
 resourceName layers/0
operationName query, 
operationInput {"returnZ":false,"returnIdsOnly":false,
"where":"","returnDistinctValues":false,"returnM":false,"returnCountOnly":false,"returnExtentsOnly":false,
"returnTrueCurves":false,"returnGeometry":true,
"spatialRel":"esriSpatialRelIntersects","geometryType":"esriGeometryEnvelope"}, outputFormat json, 
requestProperties {"computeETag":true,"ETag":"\"c429a59c\""}, 
responseProperties {"Content-Type":"text/plain"}

But it has no way of telling service name and layer name ...other than using layer index from resourceName if you want to perform layer specific operation in layers.

Sunday, August 5, 2018

[Code snippet]: Planet API Image Download Url

Be The First To Comment

from requests.auth import HTTPBasicAuth
import os
import requests


item_id = "20161109_173041_0e0e"
item_type = "PSScene3Band"


os.environ['PLANET_API_KEY'] = '3b711bededf6485a0' #not a real id
asset_type = "visual"
item_url = 'https://api.planet.com/data/v1/item-types/{}/items/{}/assets'.format(item_type, item_id)

# Request a new download URL
result = requests.get(item_url, auth=HTTPBasicAuth(os.environ['PLANET_API_KEY'], ''))
download_url = result.json()[asset_type]['location']

print(download_url)

Thursday, June 14, 2018

Monday, June 11, 2018

[Snippet]: Fetch User Name and Email Address from Windows AD Group using Powershell script.

Be The First To Comment
FetchAdUsers.ps1

#Store users' info in CSV

Get-ADGroupMember -Identity GROUPNAME -Recursive|Get-ADUser -Properties Mail, MemberOf | Select-Object GivenName, Surname, SamAccountName, Mail  | Export-csv -path GROUPNAME .csv -NoTypeInformation

Wednesday, May 30, 2018

[Code Snippet] How to a create user in arcgis portal with a custom role?

Be The First To Comment
Create a user or add member in ArcGIS portal with a custom role -

1. Get all custom roles from the portal, I presumed that the portal already has custom roles other than (org_user, org_publisher, org_admin)

from arcgis.gis import *
gis= GIS(portalUrl, userName, password)
allRoles = gis.users.roles.all(max_roles=50)

2. Create a User with Default Role

username="test"
password=''
firstname='test_name'
lastname='test_last'
email='test@test.com'
description = 'Test Account'
role = 'org_publisher'
provider = 'enterprise'
idp_username = 'test'
level = 2
thumbnail = None

newUser = gis.users.create(username, password,firstname,
               lastname, email, description, role, provider, 
               idp_username, level, thumbnail)


3. Update  the defualt role to Custom Role - Assign the role object not role name

#Assigning the first role out of many portal roles, as an example
status = newUser.update_role(role=allRoles[0]
print(status)

If role assigned success, the value of status will be True.


Reference:
https://developers.arcgis.com/python/guide/accessing-and-managing-users/

Friday, May 25, 2018

[Code Snippet] Find Custom Role of users that are in ArcGIS portal - ArcGIS

Be The First To Comment
from arcgis.gis import *

self.portalInfo = GIS(self.portalUrl, self.userName, self.password)

self.portalUsers = self.portalInfo.users.search('')

users = self.portalUsers

roleManager = arcgis.gis.RoleManager(self.portalInfo)

roles = roleManager.all()

for user in users:

if hasattr(user,'roleId'):

for role in roles:

if(user.roleId == role.role_id):

print(user.username,user.role,role.name)
 

© 2011 GIS and Remote Sensing Tools, Tips and more .. ToS | Privacy Policy | Sitemap

About Me