HEX
Server: nginx/1.24.0
System: Linux nowruzgan 6.8.0-57-generic #59-Ubuntu SMP PREEMPT_DYNAMIC Sat Mar 15 17:40:59 UTC 2025 x86_64
User: babak (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/dev/nowruzgan/rest/api/controllers/user/auth-id-cb.js
const jwt = require('jsonwebtoken');
const uuid = require('uuid');
const fs = require('fs').promises;

module.exports = {

  friendlyName: 'Auth-ID-Callback',

  inputs: {
    redirect: {
      type: 'string',
      required: false
    },
    token: {
      type: 'string',
      required: true
    },
  },

  exits: {
    dbError: { statusCode: 500 },
    success: {responseType: 'redirect'},
  },

  fn: async function (inputs, exits) {
    let action = 'user.auth-id-callback';
    sails.log.info({session: null, action, message: `Auth callback from id.nowruzgan.com.`});
    let callback = sails.config.custom.id.callback;

    let publicKey = await fs.readFile(`${global.appRoot}/cert/id.nowruzgan.com-public.pem`)
      .catch(error => sails.log.error({session: null, action, message: `on reading id.nowruzgan.com public key`, error}) && false);

    if(!publicKey)
      return exits.dbError();

    publicKey = publicKey.toString();

    let userInfo;
    try {
      userInfo = jwt.verify(inputs.token, publicKey);
    }catch(e) {
      return exits.dbError();
    }

    let user = await User.findOne({email: userInfo.email}).populate('roles')
        .intercept(sails.log.interceptError(null, action, `on finding user with sub: ${userInfo.sub}`, 'dbError'));
    if(!user){
      user = await User.create({
        email: userInfo.email,
        firstName: userInfo.firstName,
        lastName: userInfo.lastName,
      }).fetch()
        .intercept(sails.log.interceptError(null, action, `on creating user for ${userInfo.email}`, 'dbError'));
      sails.log.info({session: null, action, message: `User ${userInfo.email} <${userInfo.firstName}-${userInfo.lastName}> created`});
    }

    let token = uuid();

    let sessionData = {
      publicUser: User.getPublic(user),
      user: user,
      token: token,
      iat: userInfo.iat,
      exp: userInfo.exp,
      timestamp: (new Date()).valueOf()
    };

    await sails.helpers.cache.with({action: 'set', key: `${token}:session`, value: sessionData});
    
    if(inputs.redirect)
      exits.success(`${inputs.redirect}#token=${token}`);
    else
      exits.success(callback.replace('__TOKEN__', token));
  }
};